PHP 对象实例可以知道它的名字吗?

Can a PHP object instance know its name?

提问人:eje211 提问时间:10/7/2010 更新时间:9/6/2016 访问量:5857

问:

如果我有这样的代码:

class Person {
    $age;
    $height;
    $more_stuff_about_the_person;

    function about() {
        return /* Can I get the person's name? */;
    }
}

$John = new Person();
$Peter = new Person();

print $John->about();  // Print "John".
print $Peter->about(); // Print "Peter".

是否可以从方法中打印存储为变量名称的人的姓名?

由于这不是标准程序,我猜这是一个坏主意。

我已经查过了,但我找不到任何关于它的信息。

php 哎呀

评论

0赞 fabrik 10/7/2010
在某些情况下它会很有用,但恐怕这是不可能的。也许是变量?
2赞 Felix Kling 10/7/2010
不应该有实例变量吗?如果你的数组中有像这样的对象怎么办?Person$name$p = array(new Person(), new Person())
1赞 Pekka 10/7/2010
可能有一种非常笨拙的方式使用(这将为您提供进行调用的行)和分词器(可能会为您提供调用的变量引用),但它并不真正适合生产用途debug_backtrace()about()
2赞 Gordon 10/7/2010
(nitpick) 这不是对象实例名称,而是对象实例分配给的变量的名称。
1赞 Gordon 10/7/2010
@Mark实际上你可以用:D做到这一点${"Maureen O'Hara"} = new StdClass; $firstName = 'Maureen'; $lastName = "O'Hara"; var_dump( ${"$firstName $lastName"} );

答:

19赞 RichieHindle 10/7/2010 #1

不。对象可以有多个名称,也可以没有名称。这里会发生什么:

$John = new Person();
$Richie = $John;      // $John and $Richie now both refer to the same object.
print $Richie->about();

或在这里:

function f($person)
{
    print $person->about();
}

f(new Person());

如果对象需要知道自己的名称,那么它们需要将其名称显式存储为成员变量(如 和 )。$age$height

评论

0赞 Thomas Clayson 10/7/2010
不过,您可以有一个属性,只需在初始化类时设置该属性即可。显然,如果你知道你要分配给它的变量的名称,那么你就会知道这个名字。另外,为了逻辑上的利益,如果你知道检索对象的变量的名称,那么你无论如何都会知道这个名字...... :/
0赞 eje211 10/7/2010
在我的实际示例中,实例名称和“name”属性的值始终相同,因此似乎是多余的。但基于这些例子,它现在看到它根本不是多余的。
0赞 Mark Baker 10/7/2010
@eje211 - 如果您创建了一个$persons数组,则更为重要: $persons = array('John' => new Person('John'), 'Jane' => new Person('Jane'));
0赞 eje211 10/7/2010
@Mark Baker:那么,名称就是数组的键。但我现在明白了,这仍然是一个非常糟糕的主意。
0赞 GDmac 3/13/2012
很好的例子。如果类有办法知道它是从哪个变量或实例调用的,那么在某种程度上会很有帮助。例如,来自 $Richie->about() 或来自 $John->about()。
2赞 Craige 10/7/2010 #2

Eje211,你试图以非常奇怪的方式使用变量。变量只是数据持有者。应用程序永远不应该关心变量的名称,而应该关心变量中包含的值。

如前所述,实现此目的的标准方法是为 Person 类提供“name”属性。

重申一下,不要依赖变量名称来确定应用程序的输出/功能。

评论

0赞 still_dreaming_1 9/4/2014
您提出索赔时甚至没有费心尝试用理由来支持您的索赔。它也可能只是随机噪音。我同意这不是标准做法,但说这从来都不是一个好主意是狭隘的。这在内部 DSL 中非常有用。我同意可能没有办法做到这一点,但你是说没有人应该想这样做。
0赞 bellasys 10/15/2023
关于“......尝试使用...非常奇怪......”或者也许更中立的说法是“ 试图使用......非常出乎意料“,如果这让你感到震惊。然而,一个非常好的用例是自动化或代码创建工具,它们会或可能非常关心变量名称;甚至PHP语言本身也有一个功能,例如$$var,它支持/促进动态变量名称。
0赞 Explosion Pills 10/8/2010 #3

用户定义的变量名称应该被视为对 PHP 编译器(或任何与此相关的编译器)完全透明。您创建的对象只是指向真实对象的内存引用。他们的名字没有任何意义。姓名是人的成员。

但是,您可以使用 get_defined_vars() 获取所需的变量

foreach (get_defined_vars() as $key => $val) {
   if ($val instanceof Person) {
      echo $key;
   }
}

但是,绝对不应该这样做,并且对象仍然需要知道变量的存储顺序。不知道你会怎么计算。

评论

0赞 still_dreaming_1 9/4/2014
变量的名称没有意义是不正确的。如果这是真的,我们会给他们随机的名字,或者他们可能根本没有名字,或者这个名字会对程序员隐藏。它们是一种交流形式,它们可以意味着我们希望它们在语言支持的范围内表达的任何含义。我希望有一种得到充分支持的方法来做问题所问的事情。
0赞 dbf 9/6/2016
@still_dreaming_1 这是真的,这取决于你的观点。编译器绝对不在乎你是否以你的前女友、前妻或《权力的游戏》所有季节的完整演员的名字命名你的变量。这是第一层解释,即你,写它的人。现在,如果我们共享代码,而我不知道你的前女友或前妻是谁,以及那里的意义,我无法解释你的代码。这意味着我无法理解你对编程语言的解释。它对我来说变得毫无用处,但对编译器来说却没有。
0赞 saoud rehman 9/6/2016 #4

这个例子可能会有所帮助,目前没有方法可以告诉你必须自己指定的对象名称,如下面的代码所示:

class Person {

    public $age=0;
    public $height=0;
    public $objPerson='';

    function about($objPerson,$age,$height) {
        return 
                'Person Object Name: '.$objPerson.'<br>'.
                'Age: '.$age.'<br>'.
                'height: '.$height.'ft<br><hr>';
    }
  }

$John = new Person();

$Peter = new Person();

print $John->about('John',25,'5.5'); 

print $Peter->about('Peter',34,'6.0');