PHP:是否可以调用创建你的类?

时间:2009-06-17 11:39:24

标签: php

我在php中有一个创建另一个类的类,我希望这个子类能够调用父类,但不要将$ this作为参数传递给子类。我也不想让父类成为全局。有没有办法调用父类,某种方式像parent->函数或类似的东西?

5 个答案:

答案 0 :(得分:4)

我认为你所谓的父子关系只是一个组合('父'在层次结构类中保存一个不相关的实例,'子')。如果我的假设是正确的,那么这闻起来很糟糕,因为这两个类会紧密耦合,并指向某个地方的糟糕设计(“父”,“孩子”或两者)。

不那么臭的替代品:

  • 从'child'获取所需数据,并使用该数据调用'parent'中的方法
  • 将'parent'保存的数据传递给'child'并将方法放在那里,以便'child'可以调用它
  • 调用'parent'中的方法并将结果传递给'child'
  • 如果有意义的话使用继承,那么'parent'和'child'都变成了父和子,并且都有方法,那么'parent'就不需要创建'child',你会直接在代码中使用孩子。

答案 1 :(得分:2)

正如Maciej所说,这是非常hackish,我不推荐它,但它是可能的:

<?php

    class B 
    {
        function B() {
            $trace = debug_backtrace();
            $trace[1]['object']->y();
        }
    }

    class A 
    {
        function x() {
            $z = new B;
        }
        function y() {
            printf("hi");
        }
    }

    $test = new A;
    $test->x();

?>

答案 2 :(得分:0)

这是一种黑客攻击,但尝试分析debug_backtrace()

答案 3 :(得分:0)

  

(...)但没有将$ this作为参数传递给子类

天啊,为什么? “看着妈妈,我可以不用手握住我的小便。哎呀,现在又发生了。很棒。”

它可能是如此简单,但我想我们永远不会知道为什么这是被禁止的。我的猜测是,你只是不理解OOP(因为你在类和实例层次结构之间的混淆暗示),而你却懒得学习它。 Ceci n'est pas une pipe!

外观:

<?php
    class AClass {
        public $parent = false;

        public function setParent($parent) {
            $this->parent = $parent;
        }

        public function createChild() {
            $newInstance = new AClass();
            $newInstance->setParent($this);
        }
    }
?>
是的,就这么简单!你现在有了父母。

还是它,因为你不允许修改父类? 有一个秘密,但我会告诉你:

邪恶术士的0级限制:inheritance,也称为“class B extends A {}”。

我提前道歉是一个卑鄙,讽刺,无益的屁股,但如果我真的站在道歉的背后,我就不会写出那个答案。

但是我保证会投票你的问题(并诚实地道歉),如果你能给我们一个很好的理由,为什么禁止传递参考。

答案 4 :(得分:0)

我没有做足够的PHP知道这是否可行,但你不能将委托/回调传递给对象的构造函数吗?这样你就没有整个对象那里只是对你要调用的方法的引用!

HTH

单稳