我想知道是否允许在另一个类中创建一个类的实例。
或者,我是否必须在外部创建它,然后通过构造函数传递它?但是我会在不知道是否需要它的情况下创建它。
示例(数据库类):
class some{
if(.....){
include SITE_ROOT . 'applicatie/' . 'db.class.php';
$db=new db
答案 0 :(得分:35)
您无法在另一个类中定义类。您应该包含该类之外的其他类的文件。在您的情况下,这将为您提供两个顶级课程db
和some
。现在在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();
...
}
答案 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。错了。
答案 7 :(得分:0)
我现在才看到这个,我想补充一下我的评论。它可能对任何人都有好处。有人听说过php特性吗?尽管特征不会导入另一个类,而只会将特征导入另一个类。因此,您可以尝试拥有一个主类,而不必尝试导入多个类,而子类将充当特征,这使您可以在主/父类中使用它们。