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

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

或者,我是否必须在外部创建它,然后将其传递给构造函数? 但是那时我会创建它,而不知道是否需要它。

示例(数据库类):

class some{

if(.....){
include SITE_ROOT . 'applicatie/' . 'db.class.php';
$db=new db
Richard asked 2020-07-23T22:34:10Z
8个解决方案
36 votes

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

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

class some {

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

}
Lukáš Lalinský answered 2020-07-23T22:34:19Z
17 votes

人们说可以“在一个类中创建一个类”似乎意味着在一个类中可以创建对象/实例。 我还没有在另一个类定义中看到实际的类定义的示例,该示例如下所示:

class myClass{

    class myNestedClass{

    }

}

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

由于问题是“是否可以在另一个类中创建一个类”,所以我现在只能假定这是不可能的。

vincentDV answered 2020-07-23T22:34:44Z
14 votes

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

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

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

[HTTP://PHP.net/manual/恩/function.include.PHP]

rickchristie answered 2020-07-23T22:35:13Z
4 votes

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

Marius Burz answered 2020-07-23T22:35:33Z
2 votes

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

Radek M answered 2020-07-23T22:35:53Z
1 votes

这在带有匿名类的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;
    }
});
Jon Surrell answered 2020-07-23T22:36:22Z
0 votes

(编辑)好吧,这个问题和您想要完成的事情的例子令人困惑。从您的示例看来,您正在尝试在另一个类中定义一个类。

正确的名称是NESTED CLASS,在PHP中是不可能的。因此,在您的示例中,答案为“否”。 反正不是在PHP中。 其他语言将允许“嵌套类”。 Java就是一个例子。

例如,这将不适用于PHP

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

现在问的问题是在另一个类中创建一个类的实例。

为此,答案是“是”,您可以在“类”中实例化“对象”。 我们一直在做。

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

一个类甚至可以实例化自己。 那就是著名的单例和其他许多创造型模式。 不幸的是,有些人认为了解依赖注入意味着他们永远不会再使用方法调用NEW。 错误。

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

Siegfried DuDragon answered 2020-07-23T22:37:09Z
0 votes

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

teymzz answered 2020-07-23T22:37:29Z
translate from https://stackoverflow.com:/questions/1583140/can-i-instantiate-a-php-class-inside-another-class