php命名空间的问题

lazyphp 发布于 2013/11/08 23:40
阅读 554
收藏 0
PHP

最近在用命名空间。发现整个项目很容易充斥着use。

不同的类,每次都得use 两三其他类。而且use不能再父类定义后,子类继承去用。感觉有点不太美观。这会是项目的架构布局问题么?来个的问题详细描述

我现在纠结一个命名空间的问题。
我的系统底层有一个 自动注册类。

class ClassAutoloader {
        public function __construct() {
            spl_autoload_register(array($this, 'loader'));
        }
        private function loader($className) {
           if(file_exist($className)){
            include $className . '.php';
           }else{
             exit("不存在{$className}");
           }
        }
}
上用命名空间,这样的话。loader方法只需要做一次判断 就行了。不需要手动指向任何类的目录。但是这样有一个缺点。就是我每一个类中,用到另外一个类的东西,就得use xxxx\xxx\xxx 。这样一来,重复代码明显增加了。要是某一个叫B类的命名空间名称进行了修改,那么凡是用到use 这个B类的类,都得进行修改了。这样明显存在高耦合(这就是耦合吗?)的情况。
当然,我可以按照以前的模型。改进loader方法。
private function loader($className) {
   if(file_exist($className)){
     include $className . '.php';
   }elseif(file_exist(...)){//多个elseif,写入指定的类名
     include ....
   }else{
     exit("不存在{$className}");
   }
}
这样,USE的大量重复问题得到了解决了。不过我感觉这样没用到命名空间的特性啊。。

大家使用命名空间有这种情况吗?

----------------------------------------------------------------------

顺便问下大家的命名规则。我现在不论变量,函数,方法都使用aaaBbbbCccc这种形式命名。这样符合国际标准么。


国际惯例,先谢过各位了。


加载中
0
欣儿
欣儿
self是静态的this,命名空间,没怎么了解,反正就是学的java这些的。java的文件就是头上有很多的import,习惯就好
eechen的粉丝
eechen的粉丝
$this是调用对象里的方法和属性,self是调用类的方法和属性
lazyphp
lazyphp
原来self就是静态的this。 我不太喜欢整个项目的类中都各种 use。。以前没用命名空间,都在自动加载写好路径。可能是强迫症吧。
0
Tuesday
Tuesday

静态类没有对象的概念, 就是它没有"这个类"的意思. 没有$this

0
hylent
hylent

use太多,说明你系统设计的有问题,要高内聚低耦合啊,可以使用门面模式给你的一个包的多个类包装一下,可以使用di或者service,这样就不用每次都要use一堆来实例化了

lazyphp
lazyphp
刚才搜索了一下门面模式。原来我平常也用到这种设计模型。今晚回去还是将底层的做一个调整好了。
0
fxhover
fxhover
用static申明的是静态方法,静态方法不需要实例化对象就可以进行调用,$this关键词是实例化对象才可以使用的,还有静态方法中不能调用非静态方法,虽然你用self::foo();能调用,php会提示你foo不是静态方法却被静态方法调用语法不严格问题。
lazyphp
lazyphp
噢!这个在5.3下没有错误提示(可能禁止了报错)。我换到5.4就立马提示了。我也没注意这个语法的问题。那就是说,我要将foo也要写成 静态方法才正确了?
0
lazyphp
lazyphp

引用来自“hylent”的答案

use太多,说明你系统设计的有问题,要高内聚低耦合啊,可以使用门面模式给你的一个包的多个类包装一下,可以使用di或者service,这样就不用每次都要use一堆来实例化了

其实我有办法解决USE问题。就是手动指定对应的类文件目录,让spl_autoload_register能够自动加载到对应的文件。

但这样一来,use虽然不用写了。但却感觉丢失了命名空间的存在意义。 我布局系统时,用上use,spl_autoload_register不需要执行任何路径。只需要判断一次就行了。

class ClassAutoloader {
        public function __construct() {
            spl_autoload_register(array($this, 'loader'));
        }
        private function loader($className) {
            if(file_exist($className)){
                include $className . '.php';
            }
        }
    }
当然,重复代码越多,程序就越危险。

返回顶部
顶部