我绝对肯定以前有人问过这个问题,但我在任何地方都找不到它。
所以我有两节课。A和B
class classA
{
public $var1;
public $classbVar;
public function init()
{
// This is here because other script is run before it is called
// in the live code.
// it basically checks that the file exists. There is a reason for this.
if (file_exists('classB.php'))
{
require_once('classB.php');
}
else
{
echo "An error has occurred loading the second class.";
}
$this->var1 = "something";
$this->classbVar = new classB
echo $this->classbVar->doSomething();
}
}在单独的文件中
class classB extends classA
{
public function doSomething()
{
echo $this->var1;
}
}在第三个文件中,我调用classA并运行init函数。这不是真正的代码,但与我所写的完全相同。
那么为什么这个不起作用呢。如果我VAR_DUMP,我得到的是null....我做错了什么或被误解了吗?
让我说得更清楚一些:
还有第三个文件调用classA,如下所示;
require_once('classA.php')
$classA = new classA;
$classA->init();我很抱歉造成任何混乱,我做了一点飞行,因为我确信我遗漏了一些简单的东西。我正在尝试的方法肯定会以某种方式起作用。
发布于 2016-09-01 17:12:31
这里有两个问题会导致您的输出为空:
$classA对象,并且您在该对象上设置的任何值都不会自动在$classbVar对象上设置,因为它是一个完全不同于仅扩展A类的类的对象,而不是您刚刚生成的$classA对象。当然,除了静态属性之外...
$this->var1而不是$var1。注意如果您在$classA对象中设置了该值,则仍不会为$classbVar对象设置该值。
发布于 2016-09-01 17:18:00
$var1 = "something";
应更改为
$this->var1 = "something";此外,除非将类值声明为静态,否则不会共享类值。因此,要访问父类中的属性,您可以执行以下操作:
class classA
{
public $var1;
public function init()
{
$this->var1 = "something";
}
}
// other file
require_once("A class location");
class classB extends classA
{
public function doSomething()
{
echo $this->var1;
}
}
$b = new classB();
$b->init();
$b->doSomething();或者更干净的方式:
class A
{
protected $var1;
public function __construct()
{
$this->var1 = "something";
}
}
// other file
require_once("A class location");
class B extends A
{
public function doSomething()
{
return $this->var1;
}
}
$b = new B();
echo $b->doSomething();
// or shorter syntax
echo {new B()}->doSomething(); 最好使用PSR-4 autoloader,而不是使用require_once()。
https://stackoverflow.com/questions/39267206
复制相似问题