我可以在另一个类中实例化一个PHP类吗?

时间:2009-10-17 20:39:36

标签: php class oop object

我想知道是否允许在另一个类中创建一个类的实例。

或者,我是否必须在外部创建它,然后通过构造函数传递它?但是我会在不知道是否需要它的情况下创建它。

示例(数据库类):

class some{

if(.....){
include SITE_ROOT . 'applicatie/' . 'db.class.php';
$db=new db

8 个答案:

答案 0 :(得分:35)

您无法在另一个类中定义类。您应该包含该类之外的其他类的文件。在您的情况下,这将为您提供两个顶级课程dbsome。现在在some的构造函数中,您可以决定创建db的实例。例如:

include SITE_ROOT . 'applicatie/' . 'db.class.php';

class some {

    public function __construct() {
        if (...) {
            $this->db = new db;
        }
    }

}

答案 1 :(得分:16)

人们说'在类中创建类'可能意味着可以在类中创建对象/实例。我没有在另一个类定义中看到一个实际类定义的示例,它看起来像:

class myClass{

    class myNestedClass{

    }

}

/* THIS IS NOT ALLOWED AND SO IT WON'T WORK */

由于问题是'是否可以创建 另一个类'中的类,我现在只能假设它不可能。

答案 2 :(得分:14)

我只想指出可以在另一个类定义中动态加载类定义。

Lukas是对的,我们不能在另一个类中定义一个类,但我们可以动态地包含()或require()它们,因为包含文件中定义的每个函数和类都将具有全局范围。如果需要动态加载类或函数,只需将文件包含在其中一个类的函数中。你可以这样做:

function some()
{
    require('db.php');
    $db = new Db();
    ...
}

http://php.net/manual/en/function.include.php

答案 3 :(得分:3)

在PHP中的另一个类中创建一个类是不可能的。 在另一个对象中创建一个对象(一个类的实例)是另一回事。

答案 4 :(得分:2)

不,这是不可能的。嵌套类和聚合对象是不同的机制。实际上,嵌套类意味着嵌套类名。嵌套在B类中的A类将命名为“B \ A”(?)。从v5.3开始,您可以在命名空间中嵌套类名(和其他一些名称)。

答案 5 :(得分:1)

这可以在PHP 7中使用Anonymous classes

请参阅the docs中的示例:

df <- data[order(data$num,decreasing = TRUE),]
 barplot(df$num,names.arg = df$cat)

这是一个简单的示例,显示匿名类的使用,但不是来自类:

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

答案 6 :(得分:0)

(编辑)好的问题和你想要完成的例子令人困惑。 从你的例子看,你试图在另一个类中定义一个类。

正确的名称是NESTED CLASS,在PHP中是不可能的。 所以,就你的例子而言,答案是&#34; NO&#34;。反正不是在PHP中。其他语言将允许&#34;嵌套类&#34;。 Java就是一个例子。

例如,这不适用于PHP

class outer_class{
    class inner_class{
        ...
    }
    ...
}

现在提出的问题是在另一个班级中创建一个班级的实例。

答案是&#34;是&#34;,你可以安装一个&#34;对象&#34;在一个&#34;类&#34;。我们一直这样做。

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();
    }
}

一个类甚至可以实例化它自己。这就是着名的单身人士和其他许多人Creational patterns。可悲的是,有些人认为知道dependency injection意味着他们永远不会再在一种方法中使用NEW。错了。

有助于理解类和对象之间的区别。 class是用于创建对象的可扩展程序代码模板。 object是指类的特定实例。

答案 7 :(得分:0)

我现在才看到这个,我想补充一下我的评论。它可能对任何人都有好处。有人听说过php特性吗?尽管特征不会导入另一个类,而只会将特征导入另一个类。因此,您可以尝试拥有一个主类,而不必尝试导入多个类,而子类将充当特征,这使您可以在主/父类中使用它们。