我有一个主类和两个扩展类:
class Main {
public $foo;
}
class A extends Main {
public function setVar()
{
$foo = "test";
}
}
class B extends Main {
public function getVar()
{
return $this->foo;
}
}
$A = new A;
$B = new B;
$A->setVar();
echo "result: ".$B->getVar();
但结果($ B-> getVar())保持为空。 我清楚的简单的东西在这里......除此之外,这是去劈长班达在有关小类的方法是什么?
使用依赖注入(DI)对不同类的实例之间共享主的一个实例,而不是试图使用的传承的实施例
class Main {
public $foo;
}
class A {
protected $main;
public function setVar($data)
{
$this->main->foo = $data;
}
public function __construct(Main $main)
{
$this->main = $main;
}
}
class B extends Main {
protected $main;
public function getVar()
{
return $this->main->foo;
}
public function __construct(Main $main)
{
$this->main = $main;
}
}
$M = new Main;
$A = new A($M);
$B = new B($M);
$A->setVar("test");
echo "result: ".$B->getVar();
更改:
class A extends Main {
public function setVar()
{
$foo = "test";
}
}
至:
class A extends Main {
public function setVar()
{
$this->foo = "test";
}
}
注意$ this关键字
为了进一步澄清的东西,它可以帮助到想用这种方式。 比方说,你Main
是代表车辆(因此我们将其重命名一类Vehicle
),因此类是指Vehicle
定义veicle的特性,但没有一个特定的人做与操作(我们需要的是一个实例 )。 让我们也翻译在A级Car
和B Truck
的,所以他们是你的主类的特殊化 ,与拥有一个通用的每一个特征沿着Vehicle
,延长的“车”的概念,并指出汽车的具体行为和属性一般情况下 ,和卡车一般 ,但-这一点-不引用特定的汽车或卡车。 我们需要为实例 。
class Vehicle
{
public $numberOfTires;
}
class Car extends Vehicle
{
function smashMe()
{
echo "Oops!";
}
}
class Truck extends Vehicle
{
function smashMe()
{
echo "More Oops!";
}
}
从这一点,我们可以定义特定的情况下 (您的保时捷,我的卡玛洛......不同的车)上,我们可以执行的操作(调用方法),并设置属性。
$genericVehicle = new Vehicle;
$myPorsche = new Car;
$yourCamaro = new Car;
$hisTruck = new Truck;
$herTruck = new Truck;
但是,每一个实例保持独立于其他。
两者都是同一类的不同实例。
操作上一个实例来完成,不会对任何其他人的申请(这是有点OOP点)。
做你想做什么,你可以有B伸出A,然后在B类的一个实例进行这两种操作。