是否有一个神奇的__get方法相当于实例化类?

看看是否有任何的方式来实施样的功能__get()魔法方法,而是试图实例化一个新的类时。

我的目标是有

$foo = new Cat();

最终导致在创建一个通用对象,即

new Mammal('Cat');

这样$foo将是类的实例Mammal ,与所谓的类名'Cat'作为参数传递给Mammal的构造。



注:游戏结束我心目中,对于熟悉锂或CakePHP的,是为了避免定义一大堆类为每个不同的数据库表。 如果我这样做,大多数只会是空的,基本的CRUD操作是一切必要的。 另外,所有的包括和类定义不能是伟大的开销。 我的想法是使用一个单一的“模型”类来处理大部分的通用功能,我可以随时创建子类,如果我需要更先进的功能,为特定的数据库表。

--------------解决方案-------------

我不认为有什么简单的非哈克的方式来实现你想要的类的实例化机制。

我会建议使用一个工厂:

$tableFactory->createTable('Cat');

这将然后制定出什​​么需要幕后工作要做。 这也有,如果你决定猫需要它自己的阶级的利益,你可以简单地修改工厂,你可能不需要修改使用它的代码。

嗯,这是一个有点哈克,但你可以滥用类自动加载机...

所以,劫持了装载,检查一类“猫”,如果它不存在,那么EVAL成实存...

if (!$foundClass) {

$code = 'Class '.$class.' extends Mammal {
public function __construct() { parent::__construct("'.$class.'");}
}';
eval($code);
}

我说,这是哈克......但你总是白名单,你想这样做的类......此外,它拥有,如果你想修改类,就是创建一个它坚定的实例中受益。

但话又说回来,我会亲自找到另一种解决方案。 对我来说, new Cat()是不可读的。 这两个原因的原因,一是没有上下文的线索,它是什么,第二个我无法找到类猫......我会做的是类似于亚尼建议$table = DatabaseTable::getInstance('cat'); ...我发现,更具有可读性(即使它是多个字符)...

这样,我记得从蛋糕是你定义的模型上的控制器类的顶部,然后简单地使用$ this-> MODELNAME。 这应该是简单实现为:

public function __get($prop)
{
if(in_array($prop, $this->uses)) {
return new $prop;
}
}

每次调用一个不存在的属性,你的类将检查该属性名在一个数组$用途存在,如果是这样,假设$道具类名和instaniates它。 您将要保存实例的地方,以避免重新实例每次获取它的时间。

这比写有点清洁new Klass所有的地方,因为这使得它很难交换克拉斯别的东西。 你硬连接到控制器即可。 这是你希望避免的依赖。 随着中说,你可能想看看在Symfony的依赖注入框架。

分类:php 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.699 (s). 10 q(s)