【问题标题】:Is there a root interface or trait equivalent of the class stdClass?是否有与 stdClass 类等效的根接口或特征?
【发布时间】:2018-05-24 20:59:08
【问题描述】:

在 PHP 中,基线类是 stdClass,所有其他类都是该类的子类,并且它也是大多数情况下没有定义其他类的默认对象。

我的问题首先是是否存在等效的系统定义等效接口,例如stdInterface 或类似的东西?

其次,是否有系统定义的通用特征?我预计这不太可能,但我不会在没有确认的情况下排除它。

我不知道这两种结构,也找不到任何特别提及之前提出的任何一个甚至这个问题。如果其中一个或两个都可用,它在某些情况下可能很有用。提前致谢。

编辑:正如decezementioned elsewhere also 所指出的,stdClass 不是根类,而只是一个通用对象。

【问题讨论】:

  • 由于接口和特征不能自己实例化,你什么时候需要测试一个接口是否是instanceof 其他(根)接口?
  • 为了避免反射的重量,并检查是否存在通用接口的本地化扩展,例如有人创建了一个继承 Psr 标准的接口并添加了额外的包特定功能或其他东西。在某些情况下,我想知道包的职责范围是什么,而无需实例化对象或触发反射器(如果可以避免的话)。
  • 例如,确定是否可以在一个非常大的项目中处理一个问题,该项目已经通过 Composer 添加了作为其他包的依赖项的资产,而无需添加另一个包并进一步膨胀磁盘空间.在某些情况下,刮擦它会非常繁重,我宁愿尽可能节省一些内存。

标签: php interface traits


【解决方案1】:

PHP 中没有 stdInterface 或 stdTrait,但您可以使用 interface_existstrait_exists 来测试变量是接口还是特征,例如:

<?php
trait X {}
interface Y {}

var_export(interface_exists('Y'));
echo '<br>';
var_export(trait_exists('X'));
//Output:
//true
//true

【讨论】:

  • 在大多数情况下,如果相关构造在当前运行时尚未编译,那么这些和类似的函数将失败。使用instanceof 通常会强制spl_autoload 触发(如果尚未触发),因此是首选。
  • 虽然这些都是可行的选择,所以我仍然会支持你的答案。
【解决方案2】:

因此,$object instancof \stdClass 将始终评估为 true

那完全是demonstrably 错误的。

PHP 没有严格的自上而下的层次结构,没有顶级类,也没有顶级接口或特征。

您可以使用is_subclass_of 来确定一个类或接口是否与另一个类或接口相关,而不需要它的实例:

interface  Foo {}

class Bar implements Foo {}

interface Baz extends Foo {}

var_dump(is_subclass_of('Bar', 'Foo'));  // true
var_dump(is_subclass_of('Baz', 'Foo'));  // true

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 2010-11-24
    • 2012-03-05
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多