2014-09-23 89 views
0

我想知道这样的组合是否可能。从类A调用类B并继承类A的属性?

classA.php

class A 
{ 
    public $one = "one"; 

    function start() { 

     $this->one = "seven"; 

     include "classB.php"; 
     $two = new B; 
     print_r(get_defined_vars()); 
    } 
} 

classB.php

class B extends A 
{ 
    public $two = "two"; 

    function __construct() { 
     echo($this->one); 
    } 
} 

最后的index.php

include "classA.php"; 
$A = new A; 
$A->start(); 

当我运行的index.php,我得到如下:

Array 
(
    [one] => seven 
    [B] => B Object 
     (
      [two] => two 
      [one] => one 
     ) 
    ) 

有没有办法让B类使用更新的变量?或者我必须将代码分成两个文件并单独使用?这样它至少工作...但我不喜欢我的代码在课堂以外,我尽量减少使用全球范围...

+0

BTW:我知道__construct()的,我写的代码不__construct使__construct()根本不会被调用。 – 2014-09-23 22:51:54

+1

你真的应该多读一点关于继承的实际工作....如果B类扩展了A类,那么你应该实例化B类......但是不能通过包含类B中的类B嵌入代码....那根本不是遗传 – 2014-09-23 22:53:12

+0

你想达到什么目的? – sectus 2014-09-23 22:53:16

回答

1

您不必将b类包含到类a中。

只需使用B类扩展A,即可。

在您的输出中,您创建了一个扩展类A的新对象B,但此B对象是一个与父类无关的新实例。

试试这个:

class A { 
    public $propA = 'Property of A class'; 
} 

class B extends A { 
    public $propB = 'Property of B class'; 
} 

$obj = new B(); 

echo $obj->propA; // returns "Property of A class" 
echo $obj->propB; // returns "Property of B class" 
0

您可以使用静电。这是一个可怕的做法,但:

class A 
{ 
    public static $one = "one"; 

    function start() 
    { 

     $one = "seven"; 

     $two = new B; 
     print_r(get_defined_vars()); 
    } 
} 

class B extends A 
{ 
    public $two = "two"; 

    function __construct() { 
     echo($this::$one); 
    } 
} 
0

IMO,php.net文档是有点稀缺。这就是为什么我们有Stackoverflow,对此我很感激。感谢提示,我现在意识到了。每天学习新东西。

重点。在index.php中的代码应该是这样的:

include "classA.php"; 
include "classB.php"; 

$B = new B; 
print_r(get_defined_vars()); 

$B->start(); 
print_r(get_defined_vars()); 

现在,输出正是我需要的:

[B] => B Object ([two] => two [one] => one) // before the change 
[B] => B Object ([two] => two [one] => seven) // after the change 
相关问题