我可以在另一个类中实例化一个PHP类吗?
我想知道是否允许在另一个类中创build一个类的实例。
或者,我必须在外部创build它,然后通过构造函数传入它? 但是,我会创造它,而不知道我是否需要它。
示例(一个数据库类):
class some{ if(.....){ include SITE_ROOT . 'applicatie/' . 'db.class.php'; $db=new db
你不能在另一个类中定义一个类。 你应该在类之外包含其他类的文件。 在你的情况下,这将给你两个顶级类db
和some
。 现在在some
构造函数中,你可以决定创build一个db
的实例。 例如:
include SITE_ROOT . 'applicatie/' . 'db.class.php'; class some { public function __construct() { if (...) { $this->db = new db; } } }
人们说,“在class级内创build一个class级”是可能的,这意味着可以在一个class级内创build一个对象/实例。 我还没有看到另一个类定义中的实际类定义的例子,如下所示:
class myClass{ class myNestedClass{ } } /* THIS IS NOT ALLOWED AND SO IT WON'T WORK */
由于问题是'是否可以在另一个类中创build一个类',我现在只能假设它是不可能的。
我只想指出,可以在另一个类定义中dynamic加载类定义。
Lukas是正确的,我们不能在另一个类中定义一个类,但是我们可以dynamic地包含()或require()它们,因为包含文件中定义的每个函数和类都将具有全局作用域。 如果您需要dynamic加载类或函数,只需将文件包含在某个类的函数中即可。 你可以这样做:
function some() { require('db.php'); $db = new Db(); ... }
在PHP的另一个类中创build一个类是不可能的。 在另一个对象中创build一个对象(一个类的实例)是另一回事。
不,这是不可能的。 嵌套类和聚合对象是不同的机制。 嵌套类实际上意味着嵌套类名 。 嵌套在类B中的类A将被命名为“B \ A”(?)。 从V5.3开始,可以在名称空间中嵌套类名(和其他一些名称)。
这是可能的在PHP 7与匿名类 。
查看文档中的示例:
class Outer { private $prop = 1; protected $prop2 = 2; protected function func1() { return 3; } public function func2() { return new class($this->prop) extends Outer { private $prop3; public function __construct($prop) { $this->prop3 = $prop; } public function func3() { return $this->prop2 + $this->prop3 + $this->func1(); } }; } } echo (new Outer)->func2()->func3(); // Output: 6
这是一个简单的例子,显示匿名类的使用情况,但不是在类中使用:
// Pre PHP 7 code class Logger { public function log($msg) { echo $msg; } } $util->setLogger(new Logger()); // PHP 7+ code $util->setLogger(new class { public function log($msg) { echo $msg; } });
(编辑)好的问题和你想要完成的例子令人困惑。 从你的例子看来,你正试图在另一个类中定义一个类。
正确的名字是NESTED CLASS,在PHP中是不可能的。 所以,对于你的例子,答案是“否”。 反正也不是PHP。 其他语言将允许“嵌套类”。 Java是一个例子。
例如,这不会在PHP中工作
class outer_class{ class inner_class{ ... } ... }
现在要问的问题是在另一个class上创buildclass级的实例。
对此,答案是“是”,你可以在“class级”里面find一个“对象”。 我们一直这样做。
class simple_class{ protected $instanceOfOtherClass; public function instanciateObject_KeepingAReferenceToIt(){ // create an instance of OtherClass and associate it to $this->instanceOfOtherClass $this->instanceOfOtherClass = new OtherClass(); } public function instanciateObject_Without_KeepingAReferenceToIt(){ // create an instance of OtherClass and return it return new OtherClass(); } }
一个类甚至可以实例化自己。 这就是着名的单身人士和许多其他的创造型模式 。 可悲的是,有些人认为,了解dependency injection意味着他们将永远不会在方法中再次调用NEW。 错误。
它有助于理解一个类和一个对象之间的区别。 类是用于创build对象的可扩展程序代码模板。 对象是指一个类的特定实例。