我很困惑,很长一段时间,我用这种方式使用PHP classess:
class A {
private $temp;
public function __construct() {
for($i=0; $i<=300000; $i++) { $this->temp[ $i ] = "Nedzad Alibasic"; }
}
}
然后是另一个在构造中包含参数的类,其中我将类A作为声明的模型传递:
class B {
private $a;
public function __construct($a) { $this->a = $a; }
}
一切都很好,我可以很容易地通过class A
来引用$b->a->somefunction();
但是在我看来总是这样,当我将A分配给B时,我会收取额外的记忆,因为我通过了整个类? 但是我如何看待它,传递和扩展课程几乎没有区别?
我的意思是,是否有人可以引导我为什么在内存几乎没有差异时我应该从这种方式切换到class B extends A { /** code **/ }
?
或者我可以使用其他有用的扩展,但不能在传递类中作为参数使用。
最好的问候。
答案 0 :(得分:2)
扩展而不是包装在类的属性中的优点是,当你扩展时,你说B也是A类,这意味着代码中的所有地方都需要一个A类,B可能是如果B从A延伸,则使用。
<?php
class A {
private $temp;
public function __construct() {
for($i=0; $i<=300000; $i++) { $this->temp[ $i ] = "Nedzad Alibasic"; }
}
public function getTemp(){
return $this->temp;
}
}
class B extends A{
public function __construct() {
parent::__construct();
}
}
function showFirstElementOfTemp($object){
if($object instanceof A){
echo $object->getTemp()[0];
}else{
echo "Not an A";
}
}
$b = new B();
showFirstElementOfTemp($b); //Outputs "Nedzad Alibasic"
正如你所看到的,这是有效的,因为B是一个A,并且在我们检查实例的函数中将B作为参数传递,并确保我们有一个类型A,B也被接受。
除此之外,包装A以便访问它的方法和属性是相同的,除了你不会获得这种继承类型的层次结构。
答案 1 :(得分:2)
您习惯做的是一种构图形式,而使用extend
当然是继承。通常组成为docs repo。你可能应该继续这样做。有大量资源描述preferred over inheritance的利弊;选一个好的很难,但我建议你读一些。