destoon's design 一 oop pop and namspace
source link: https://hexo.hainuo.info/posts/destoon-source-1-oop-function-pop-namespace/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
在这篇文章名字中使用优秀是经过我这两天研究后决定的。
原因是我在使用了这么多年的 oop
后再见到 function
的惊讶。
正如我在一开始入门编程时,仅会用 html
后来半推半就的了解了点 asp
,第一次看到别人的 asp
代码用了函数定义一样。
我也不知道文章会如何分,在未完成之前就随手记吧。
通过对入口文件分析来说说 oop
和 函数式
的不同
-
大部分的
oop
习惯于使用单入口,因为单入口更加方便处理,使用基类进行处理让系统更加完整,可以通过基类进行解耦,不用过多关注业务逻辑之外的架构。 -
在看到
destoon
后让我想到了discuz!
,当年在使用论坛程序的时候我们就在用了这样的方式。 总结特点如下:命名空间
-
暂且不说
discuz!
单入口解决方案。我这里研究了下destoon
的分站解决方案。destoon
的分站首页和主站首页用了相同的入口文件-
入口文件引入的公共文件
common.inc.php
定义几个变量$city_domain = $city_template = $city_sitename = '';
-
如果开启了分站
$DT['city']
为0 未开启 为1 开启 这里使用了缓存 导致比较难以明确$DT['city']
的来源 具体可以通过查看cache_module()
方法来确认。 -
如果开启分站则加载分站处理公共脚本
city.inc.php
; -
通过匹配域名
getenv('http_host')
来获取到网站访问域名,然后去city
表中查询域名对应的分站,如果存在则,将表查询的id
赋给cityid
,来确定有分站。 -
通过
cityid
再次得到分站信息然后赋值$c = $db->get_one("SELECT * FROM {$DT_PRE}city WHERE areaid=$cityid"); $city_name = $c['name']; $city_domain = $c['domain']; $city_template = $c['template'];
-
得到了城市分站相关信息模板设置,然后就是堵数据处理模板了。
-
入口文件引入的公共文件
-
通过3的分析,再次让我感受到了
destoon
作者设计的苦心。我们在用oop
在基类中的构造方法中也是完成这一套逻辑。同样跟oop
对比后,我们发现我们对于oop
的认同感增强了,而对于函数式这种写法也更加排斥。 因为你不知道某个变量来自于哪里,尤其是我们用extract($array)
后的崩溃感。
命名空间与函数和变量隔离
-
在函数式中我们没法定义两个相同名称的
funciton
; -
在
oop
中我们可以在不同的类中定义相同名称的function
,但是在公共函数文件中仍然跟函数式一样无法定义相同名称的function
; -
命名空间的出现让我们避免了这个问题。当我们对一个
php
语言文件顶部增加namespace Foo;
的时候,我们就将这个文件划分到了Foo
空间下。如下面对的代码.namespace Foo; function base64_urlSafeEcode($data){ $find = ['+', '/']; $replace = ['-', '_']; return str_replace($find, $replace, base64_encode($data)); }
这个时候我们调用
base64_urlSafeEcode()
的时候需要使用\Foo\base64_urlSafeEcode()
;当然可以将这个方法明明为base64_encode()
。之所以定义不同名称是为了更好让人理解,这个base64
编码方法是url 安全
的。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK