提问人:eje211 提问时间:10/7/2010 更新时间:9/6/2016 访问量:5857
PHP 对象实例可以知道它的名字吗?
Can a PHP object instance know its name?
问:
如果我有这样的代码:
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".
是否可以从方法中打印存储为变量名称的人的姓名?
由于这不是标准程序,我猜这是一个坏主意。
我已经查过了,但我找不到任何关于它的信息。
答:
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');
下一个:HTML5 方向轴跳转
评论
Person
$name
$p = array(new Person(), new Person())
debug_backtrace()
about()
${"Maureen O'Hara"} = new StdClass; $firstName = 'Maureen'; $lastName = "O'Hara"; var_dump( ${"$firstName $lastName"} );