Php函数名称与类配对

时间:2011-06-22 15:14:16

标签: php function

将函数名与类配对是否被认为是不好的做法?

例如在kohana,我可以做以下事情。

function Model($a,$b){
    return new Model($a,$b);
}

然后我可以删除所有对new的引用,不必创建$ temp变量,也不会出现工厂混乱。

$temp = new Model('book');
$book=$temp->where('title','=','name')->find();

或者

$book = Model::factory('book')->where('title','=','name');

$book = Model('book')->where('title','=','name');

我知道全球污染很严重,起初看起来有点模糊,但它有它的好处。

我的意思是如果其他人定义了一个与该类无关的函数会更加混乱,为什么不使用该函数呢?

例如:

$book = new Model('book');
// looks so close to the above, it's scary
$book = Model('book');

其他优点或缺点?

3 个答案:

答案 0 :(得分:1)

偶尔这样做。它有时可以使代码更具可读性。

这叫做工厂程序。但如果它们不那么浅薄则最有意义。例如,如果依赖于参数,这样的方法可能会返回不同的对象(替代占位符/存根对象):

class User { ... }

function User($id) {
    return ($id < 0) ? new PlaceholderUser() : new User($id);
}   // or another *stub object* to support the application flow

但当然你可以使用它来获得更好的外观。它基本上比普通的静态工厂方法更清洁。但我会为你真正使用很多的对象保留这样的包装函数。使用每个现有类的包装调用来填充函数作用域是没有意义的。

这里常见的批评是:没有经验的开发人员很容易被没有new的对象实例化混淆。 (不确定这是否属实。但在这种情况下经常会这样说。)

答案 1 :(得分:0)

这就是构造函数在PHP v5之前的工作方式(即,不是将它们命名为“__construct”),所以你可能不希望这样做。

(编辑:误解了你的问题,无视。我没有发现该功能是在全球范围内定义的。)

答案 2 :(得分:0)

恕我直言,这是PHP中的一个错误!我认为标识符在其命名空间中应该是真正唯一的,不应区分它是类还是函数。对于属性和方法之间的PHP(任意?)区分,情况也是如此。 (曾经尝试过在对象上调用存储为属性的闭包吗?)

也许有人可以对这些特点有所了解,除了允许丑陋的黑客外,它们似乎对我没有任何好处。

我强烈反对使用这些技术。我从未见过PHP书(或官方参考)明确提到标识符的这种“冲突”。 (如果我错了,请纠正我),但我认为这并不常见。正如马里奥已经指出的那样,我认为这是令人困惑和误导的。

我希望Model()函数实际上可以做一些事情,而且我很恼火只是去了解它的定义,发现有人懒得使用new和变量!< / p>