我可以实例化另一个类中的PHP类?(Can I instantiate a PHP class in

2019-08-19 19:06发布

如果允许创建另一个类中的类的实例,我想知道。

或者说,我要在外面创建它,然后把它传递通过构造? 但后来我会不知道我是否需要它创造了它。

实施例(一个数据库类):

class some{

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

Answer 1:

你不能在另一个类中定义一个类。 你应该包括与类之外的其他类文件。 在你的情况,将会给你两个顶级类dbsome 。 如今在构造函数中some你可以决定创建的实例db 。 例如:

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

class some {

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

}


Answer 2:

人们说,这是可能的“一类中创建一个类”似乎意味着它可以在类中创建一个对象/实例。 我还没有看到其他的类定义内的实际类的定义,它看起来像的一个例子:

class myClass{

    class myNestedClass{

    }

}

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

由于问题是“是否有可能创建一个类在另一个类 ”,我现在只能认为它是不可能的。



Answer 3:

我只是想指出,这是可能的动态加载内其他的类定义一个类定义。

卢卡斯是正确的,我们不能定义另一个类中的一类,但我们可以包括()或require()他们动态的,因为在包含文件中定义的每个函数和类将具有全局范围。 如果您需要加载类或函数动态,简单地包括的类的功能之一的文件。 你可以这样做:

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

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



Answer 4:

这是不可能在PHP另一个类创建一个类。 创建另一个对象的对象(类的实例)是不同的东西。



Answer 5:

不,这是不可能的。 嵌套类和聚合对象是指出错误的机制。 嵌套类意味着嵌套类的名称 ,其实。 嵌套在B类类A将被命名为 “B \ A”(?)。 从V5.3你可以在命名空间嵌套类名(以及一些其他的名字)。



Answer 6:

这可能是在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;
    }
});


Answer 7:

(编辑)好这个问题,你正在试图完成的例子是混乱。 它从你的例子似乎您试图定义另一个类中的一类。

这样做的正确的名称是嵌套类,它是不可能在PHP。 所以,你的例子中,答案是“NO”。 不要在PHP反正。 其他语言将允许“嵌套类”。 Java的就是一个例子。

例如这不会在PHP工作

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

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

这个答案是“YES”,你可以实例化一个“类”内的“对象”。 我们做这一切的时候。

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

一类甚至可以实例化本身。 这就是著名的单身的确和许多其他创建模式 。 可悲的是有些人认为,寂寂依赖注入意味着他们将永远不会再次呼吁新的方法。 错误。

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



Answer 8:

我刚才看到这一点,我想补充我的意见。 这可能有利于任何人。 有没有人听说PHP的特质? 虽然特质不会导入另一个类,但只进口了特质到另一个类。 因此,而不是试图导入几个类,你可以有一个主要CLASSE,而子类将被用作特质使你有可能在主/父类中使用它们



文章来源: Can I instantiate a PHP class inside another class?