php - 在 PHP 中,从基类的实例创建扩展类的对象

标签 php

如果我有一个扩展类 Bar 的类 Foo 和一个 Bar 实例,是否可以使用该 Bar 实例来“填充”一个新的 Foo 实例?

基本上,我只能检索 Bar,但我想在我的代码中使用 Foo,因为它为我提供了很多额外的方法。

我看到很多类似问题的解决方案,但它们似乎都是 python 或 c#。

我无法使用 ReflectionClass::newInstanceArgs,因为我无法访问首先进入 Bar 的构造函数以创建它的数据。

最佳答案

完成此操作的推荐方法是通过 dependency injection . Foo 的构造函数可以接受 Bar 的实例,然后您必须编写代码来加载新的 Foo 的状态Bar 对象中的对象。

如果 PHP 具有完全符合您描述的功能,那将是有问题的,因为即使 Foo 扩展了 Bar,这两个类仍然可能非常不同。我不明白 PHP 是如何聪明到知道如何自动将一个类的实例转换为另一个类的实例。

话虽如此,在正确的情况下,下面的(非常老套的)“解决方案”可以满足您的描述。我不建议实际使用它。我主要只是想表明您必须求助于一些奇怪的东西才能做到这一点。

function convertObject($object, $newClass)
{
    return unserialize(
        preg_replace(
            '/^O\:\d+\:"[^"]+"/',
            'O:'.strlen($newClass).':"'.$newClass.'"',
            serialize($object)
        )
    );
}

关于php - 在 PHP 中,从基类的实例创建扩展类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708243/

相关文章:

php - 如何使用 php 在 Amazon api 中访问超过 10 个项目的详细信息?

PHP 7.2.14 "short_open_tag = On"被忽略

php - 在imagemagick中从png到jpg的透明背景

php - 连接 4 个 MySQL 表

php - 将信息悬停在缩略图上时显示信息

php - mysql 查询 where condition 在 int 上工作但在 string 上不工作

php - 使用 PHP_EOL 时没有在输出中换行

php - Laravel 在所有 api 路由中使用 Web 身份验证重定向到主页

php - 需要在 php 中大写字母的每个排列

php - Symfony 仅输出模板——不添加到 layout.php