php - 在忽略参数类型提示的同时调用 PHP 方法

标签 php reflection type-hinting

给定:

class Foo {
    private $bar;

    public function setBar(Bar $bar) {
         $this->bar = $bar;
    }
}

是否有任何方法调用 setBar() 参数不是 ?

$proxy = new Proxy();

$foo = new Foo();
$foo->setBar($proxy);

// with
class Proxy  {
}

想法是注入(inject)一个proxy 对象而不是Bar 实例。 Proxy 类是通用的(在依赖注入(inject)框架中),不能用于实现/扩展 Bar


Reflection API 似乎没有提供任何使之成为可能的东西。我希望在不使用 PHP 扩展(标准 PHP 安装 > 5.3)的情况下做到这一点(如果可能的话,我试图单独保留 eval)。

注意:是的,这是很奇怪的东西,我期待对此发表评论,但请留下“答案”以获得问题的实际答案。这不是生产代码。

最佳答案

是否需要调用 setBar(),或者您可以只设置私有(private) $bar 属性吗?

后者可以通过 ReflectionProperty::setAccessible 实现, 然后你可以将任何东西分配给你想要的属性(property),就好像它是一个公共(public)属性(property)一样。它实际上不会将其公开,但可以通过反射类对其进行修改。

AFAIK,如果不在字符串中创建临时类,然后对它们求值,前者是不可能的,这就是模拟框架所做的。

关于php - 在忽略参数类型提示的同时调用 PHP 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592931/

相关文章:

c# - 动态获取属性值

python - "TypeError: ' 在函数签名中输入 ' object is not subscriptable"

java - 无法从 php exec 方法执行 java 类文件?

php - CakePHP:在 HABTM 中保存数据的正确格式是什么

c# - PropertyInfo.GetValue 返回枚举常量名称而不是值

python - 如何让Mypy意识到在某些情况下不会使用默认值

python - 如何输入提示动态类实例化,如 pydantic 和数据类?

php - 在mysql中保存和查询区域

php - Jquery表单提交依然清爽

java - 为什么我不能在 Processing 中使用 Java 的 getDeclaredMethod()?