【问题标题】:Get properties of "parent creating" object获取“父创建”对象的属性
【发布时间】:2016-07-15 05:53:21
【问题描述】:

我有一个我只知道类名的对象,比如说“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() 我可以看到我需要的对象的属性向后退了几步,但我认为以这种方式使用该函数来获取我需要的信息是相当hacky,我认为这也是一个相当密集的功能。

我是 PHP 的新手,我想要实现的目标是完全错误的吗?有没有更好的办法?

【问题讨论】:

  • 不能在创建B的时候传递A类的引用吗? $b = new B($this);
  • 不幸的是,正如我上面所说,它是第三方组件,如果我破解核心文件,我担心如果代码从供应商那里更新,我以后会遇到麻烦。这是正确的想法还是只是小题大做?
  • 好吧,那么看来您想要的是使用全局变量。这是一个不好的做法,但比debug_backtrace 更好。当你创建B对象时,或者在A对象的__construct中,你可以写$GLOBALS['_A'] = $this;,然后你可以在B中用$GLOBALS['_A']->var检索它。
  • 这两个类都是核心代码的一部分,我可以从稍后在类中调用的“模板”文件中访问 Class B 中的对象。我已经编辑了我的问题,以便更好地指出这一点。

标签: php object backtrace


【解决方案1】:

遗传是一种成熟的编程原则,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了解更多信息。

【讨论】:

  • 谢谢你,Fernando,不幸的是,我正在使用的这些类在任何方面都相关,它们是完全分开的,没有扩展或任何东西。我编辑了我的问题以更好地突出这一点。
  • 所以。你也可以使用php的接口和实现。了解如何。 php.net/manual/es/language.oop5.interfaces.php
  • 如果你不想使用extends来继承从A类到B类的所有属性,访问属性的唯一方法是创建一个新的类实例并访问他们用自己的变量。
  • 谢谢,界面功能挺有意思的!不幸的是,我无法真正触及这些类的声明中的任何内容,因为它们是这个第三方组件的核心代码的一部分,所以我无法实现它。
猜你喜欢
  • 2017-01-25
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多