PHP:扩展类

时间:2016-09-01 09:05:06

标签: php class extends

我绝对相信以前曾经问过,但我无法在任何地方找到它。

所以我有两节课。 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();

我为任何困惑道歉,我在飞行中做了一点,因为我确信我在这里错过了一些简单的东西。当然,我试图这样做的方式将以某种方式工作。

2 个答案:

答案 0 :(得分:0)

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

  1. 您正在生成一个新的$classA对象,并且您在其上设置的任何值都不会自动在$classbVar对象上设置,因为这是一个完全不同的类,只是扩展了{ {1}}类,而不是刚刚生成的A对象。
    当然除了静态属性......
  2. 如果要在对象中设置属性的值,则需要$classA而不是$this->var1
    注意如果您在$var1对象中设置了值,则仍然没有为$classA对象设置该值。

答案 1 :(得分:0)

  1. 把require_once放在类声明之上(这不是大问题,但它更清楚)
  2. 将变量分配给类属性,因为它们的方式只是在方法范围内。

    $var1 = "something";

  3. 应改为

        $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更好。