首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:扩展类

PHP:扩展类
EN

Stack Overflow用户
提问于 2016-09-01 17:05:06
回答 2查看 169关注 0票数 0

我绝对肯定以前有人问过这个问题,但我在任何地方都找不到它。

所以我有两节课。A和B

代码语言:javascript
复制
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();

    }
}

在单独的文件中

代码语言:javascript
复制
class classB extends classA
{
     public function doSomething()
     {
          echo $this->var1;
     }
 }

在第三个文件中,我调用classA并运行init函数。这不是真正的代码,但与我所写的完全相同。

那么为什么这个不起作用呢。如果我VAR_DUMP,我得到的是null....我做错了什么或被误解了吗?

让我说得更清楚一些:

还有第三个文件调用classA,如下所示;

代码语言:javascript
复制
require_once('classA.php')
$classA = new classA;
$classA->init();

我很抱歉造成任何混乱,我做了一点飞行,因为我确信我遗漏了一些简单的东西。我正在尝试的方法肯定会以某种方式起作用。

EN

回答 2

Stack Overflow用户

发布于 2016-09-01 17:12:31

这里有两个问题会导致您的输出为空:

  1. 您正在生成一个新的$classA对象,并且您在该对象上设置的任何值都不会自动在$classbVar对象上设置,因为它是一个完全不同于仅扩展A类的类的对象,而不是您刚刚生成的$classA对象。

当然,除了静态属性之外...

  • 如果你想在对象中设置属性的值,你需要$this->var1而不是$var1

注意如果您在$classA对象中设置了该值,则仍不会为$classbVar对象设置该值。

票数 0
EN

Stack Overflow用户

发布于 2016-09-01 17:18:00

  1. 将require_once放在类声明之上(这不是什么大问题,但更清楚)
  2. 将变量赋值给类属性,因为它们的操作方式它们的作用域只在方法内。

$var1 = "something";

应更改为

代码语言:javascript
复制
    $this->var1 = "something";

此外,除非将类值声明为静态,否则不会共享类值。因此,要访问父类中的属性,您可以执行以下操作:

代码语言:javascript
复制
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();

或者更干净的方式:

代码语言:javascript
复制
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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39267206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档