我绝对相信以前曾经问过,但我无法在任何地方找到它。
所以我有两节课。 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我得到了......我做错了什么或被误解了?
让我更清楚:
第三个文件调用classA,如下所示;
require_once('classA.php')
$classA = new classA;
$classA->init();
我为任何困惑道歉,我在飞行中做了一点,因为我确信我在这里错过了一些简单的东西。当然,我试图这样做的方式将以某种方式工作。
答案 0 :(得分:0)
这里有两个问题会导致输出为空:
$classA
对象,并且您在其上设置的任何值都不会自动在$classbVar
对象上设置,因为这是一个完全不同的类,只是扩展了{ {1}}类,而不是刚刚生成的A
对象。 $classA
而不是$this->var1
。 $var1
对象中设置了值,则仍然没有为$classA
对象设置该值。答案 1 :(得分:0)
将变量分配给类属性,因为它们的方式只是在方法范围内。
$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();
不使用require_once()
,而是使用PSR-4 autoloader更好。