题
我们知道,使用JavaScript创建匿名对象很容易,就像下面的代码一样: 通用标签
输出: 通用标签
在PHP的情况下可以应用相同的技术吗?我们可以在PHP中创建匿名对象吗?
解决方案
已经有好几年了,但是我认为我需要保持最新信息!
在php-7中,可以创建匿名类,因此您可以执行以下操作: 通用标签
您可以在RFC(已接受)中阅读有关此内容的更多信息: https://wiki.php.net/rfc/匿名类
但是我不知道它与Javscript的实现方式有多相似,因此它们可能是javascript和php中的匿名类之间的一些区别。
编辑:
根据发布的评论,这是当前手册的链接: http:// php。net / manual / en / language.oop5.anonymous.php
其他提示
在谈论对象时,“匿名”不是正确的术语。最好说“匿名类型的对象”,但这不适用于PHP。
PHP中的所有对象都有一个类。 “默认”类为 stdClass
,您可以通过这种方式创建对象:
通用标签
您还可以利用将数组强制转换为对象以获得更方便的语法: 通用标签
但是,建议将数组强制转换为对象可能会为那些无效PHP变量名称的数组键产生“有趣的”结果-例如,这是我的答案,它显示了键以数字开头时会发生什么。
是的,有可能!使用这个简单的 PHP匿名对象类。运作方式: 通用标签
当然,此对象是AnObj
类的实例,因此它并不是真正的匿名对象,但可以像JavaScript一样在运行时定义方法。
直到最近,这都是我即时创建对象的方式。 通用标签
然后: 通用标签
但是现在我去: 通用标签
然后像以前一样: 通用标签
当然,如果您已经知道属性和值,则可以像前面提到的那样在内部设置它们: 通用标签
NB:我不知道它可以在哪个版本的PHP上运行,因此您需要注意这一点。但是我认为第一种方法(如果在构造时没有要设置的属性,这也很短)应该适用于所有具有json_encode / json_decode 的版本
如果您想模仿JavaScript,则可以创建一个类Object
,从而获得相同的行为。当然,这已经不再是匿名的了,但是可以使用。
通用标签
这将输出元素2 。这是从有关PHP的评论:类和对象中被盗的。
将数组转换为对象: 通用标签
如果您要创建具有动态属性的对象(例如javascript中的对象),而没有收到未定义属性的警告,则可以在未为属性设置值的情况下 通用标签
在PHP的情况下可以应用相同的技术吗?
否-因为javascript使用原型或对象的直接声明-在PHP(以及许多其他OO语言)中,只能从类中创建对象。
问题就变成了-您可以创建一个匿名类吗?
同样,答案是否定的-您将如何在无法引用该类的情况下实例化该类?
对于想要递归对象的人: 通用标签
在PHP文档中,还有更多示例: 通用标签
$ obj1和$ obj3是相同的类型,但是$ obj1!== $ obj3。另外,这三个都将json_encode()转换为简单的JS对象{}: 通用标签
输出: 通用标签