2016-03-28 127 views
1

我有一个对象,我只知道类名称,让我们说“A”。我正在尝试访问此对象的属性。不幸的是,我试图从另一个对象实例访问它们,这是由第一个对象创建的,完全不同的类(也不扩展或相关)。下面简化代码来解释情况。获取“父创建”对象的属性

Class A { 

    public $var; //some important stuff 

    function createObjectB() { 
     $b = new B(); 
    } 
} 

Class B { 
    // a totally different class not related with A 
} 

这是一个CMS组件的第三方代码,所以我不能乱用核心代码(或至少我认为?)尝试将资源用B创建的对象传递下去,而不会导致错误稍后如果此组件得到更新。

由于之后在B类中调用的“布局模板”文件,我可以从B类获取对象,如果核心代码得到更新,那么将不会触及它。这样我就不能碰这些类。

使用从object B一个debug_backtrace()我可以看到几回踩我需要的对象的属性,但我认为这是相当哈克使用函数这种方式来获得我需要的信息,我认为这是一个相当密集功能也使用。

我在PHP中是个相当新手,难道我试图实现什么?有没有更好的方法?

+0

你创建B时不能传递给A类的引用吗? '$ b = new B($ this);' – Federkun

+0

不幸的是,正如我上面所说的,这是第三方组件,如果我用核心文件破解,恐怕以后如果代码从供应商更新时会遇到麻烦。这是正确的想法还是只是一个小题大做? – Gruber

+0

那么,那么似乎你想要的是使用全局变量。这是一个**错误的实践**,但更好的是'debug_backtrace'。当你创建'B'对象时,或者在''A'对象的__construct中,你可以写'$ GLOBALS ['_A'] = $ this;',那么你可以用'$ GLOBALS [ '_A'] - > var'。 – Federkun

回答

0

遗传是一个行之有效的编程原则,PHP在你的对象建模中使用它。这个原则将影响许多类和对象相互关联的方式。

例如,扩展一个类时,子类继承父类的所有公共和受保护的方法。除非覆盖这些方法的类保留其原始功能。

这对定义和抽象功能非常有用,并允许在类似对象中实现附加功能,而无需重新实现所有共享功能。

重要提示:除非使用自动加载,否则类必须在使用之前定义。如果一个类扩展了另一个类,那么父类必须在子类结构之前声明。此规则适用于从其他类和接口继承的类。

<?php 

class Foo 
{ 
    public function printItem($string) 
    { 
     echo 'Foo: ' . $string . PHP_EOL; 
    } 

    public function printPHP() 
    { 
     echo 'PHP is great.' . PHP_EOL; 
    } 
} 

class bar extends Foo 
{ 
    public function printItem($string) 
    { 
     echo 'Bar: ' . $string . PHP_EOL; 
    } 
} 

$foo = new Foo(); 
$bar = new Bar(); 
$foo->printItem('baz'); // Salida: 'Foo: baz' 
$foo->printPHP();  // Salida: 'PHP is great' 
$bar->printItem('baz'); // Salida: 'Bar: baz' 
$bar->printPHP();  // Salida: 'PHP is great' 

?> 

您必须知道您可以将新对象生成到另一个类中。但是你可以继承所有从A类到B类的属性而不需要创建一个新的实例。例如:

<?php 

    Class A { 

     public function something() { 
      $var = 'Hello!'; 
      return $var; 
     } 
    } 

    Class B extends A { 

     function createObjectB() { 
      echo $this->something().' I am learning classes in php'; 
     } 
    } 

    $b = new B; 
    $b->createObjectB(); 

?> 

请访问此页http://php.net/manual/es/language.oop5.inheritance.php更多有关。

+0

谢谢Fernando,不幸的是,我正在合作的课程与此无关,它们完全分开,没有任何延伸或任何其他内容。我编辑了我的问题以更好地突出这一点。 – Gruber

+1

所以。你也可以使用php的接口和实现。了解如何。 http://php.net/manual/es/language.oop5.interfaces.php –

+0

如果你不想使用extends来继承从A类到B类的所有属性,唯一的方法是访问属性创建类的新实例并使用自己的变量访问它们。 –