2011-10-07 82 views
0

好了,所以代码这是我控制的作品外是这样的:如何获得使用的属性名称由外对象从内对象内的对象在PHP

Class A { 

    function use_b($b_name) { 
     $this -> $b_name = new B(); 
    } 
} 

Class B { 
    var $stuff; 
} 

这样的对象类B在类A内部,并且类A将使用传入名称作为类B属性的属性名称。 B类完全不知道它给出的名称,实际上并不需要知道。但我需要知道它是为了从类A访问B类。

我确实有足够的控制权,可以为类B创建属性并将其设置为名称类A给出它的if这是可能的。然后我可以让类B把它的名字传回给我需要遍历类B的函数(目前它只返回外部对象,所以我有权访问类BI,但不知道它的名称)。

如果没有任何意义,请评论并告诉我。

+0

所以你不能实际编辑use_b方法/编辑任何类A? – Max

回答

1

找出A的持有B实例的成员并不难。试试这个代码:

<?php 
Class A { 
    function use_b($b_name) { 
     $this -> $b_name = new B(); 
    } 
} 

Class B { 
    var $stuff; 
} 

$a = new A(); 
$a->use_b('test'); 

foreach(get_object_vars($a) as $key=>$val) 
    if(get_class($val) == 'B') 
     echo $key . " is the member that holds an instance of B"; 
+0

不幸的是,还有一个问题。对于一个(不挑剔,但...),我希望避免循环通过外部对象。更大的问题是use_b可能被多次调用。我会有一个短名单来工作,但仍然没有完整的证明。 – Anthony

+0

我不确定如果我正确地得到您的问题:您只能访问A的对象,在成员中持有B的多个实例,其名称您不知道。即使B知道变量的名称,你会从中受益多少? – janoliver

+0

伟大的问题! B有一个方法,其中包括调用所有自定义函数注册到类型A的记录,并将这些函数传递一些稀疏信息以及整个A对象。 B还具有与B的关系所特有的一些属性,它存储为B的属性,而不是将它们传递给A(这很有意义,实际上,因为A可以有多个B)。我需要B也传递它的属性名称(如果可能的话),以便我可以获得这些特定于B的属性并在我的函数中做出相应的响应。我认为,如果让B在功能中传递自己,那将太昂贵了...... – Anthony