php - 有没有办法将数组转换为类属性?

标签 php arrays class object type-conversion

有一种方法可以获取类属性并使用 (array) 转换来转换它。

$user = (array) get_object_vars($userObject)

但我想知道,我没有找到任何将数组属性转换为类属性的直接方法。

假设我有具有以下实现的用户类:

class User
{
    private $id = 0;
    private $fname = '';
    private $lname = '';
    private $username = '';
}

我有以下数组:

$user = array(
    'id'=> 2,
    'fname' => 'FirstName',
    'lname' => 'LastName',
    'username' => 'UserName'
);

我正在寻找类型转换,就像我们有 (object) 一样。问题是 (object) type cast converts array to stdClass object,但在这里我希望我的数组被转换成我指定的类。

这个例子应该这样表述:(我的假设,PHP 应该有这个。或者它可能已经有这样的东西,我不知道。)

$userobj = (object User) $user;

上面语法的结果应该是这样的:

$userobj->id = $user['id'];
$userobj->fname = $user['fname'];
$userobj->lname = $user['lname'];
$userobj->username = $user['username'];

我想知道有没有直接的方法,不是映射逻辑。寻找语言级别的技巧。

注意:我知道使用 foreach 来完成上述工作。我正在寻找一些直接方法(如果在 PHP 中可用)但尚未成为焦点(可能是!)。

以下没有解决我的问题: Convert/cast an stdClass object to another class

最佳答案

数组不是对象。所以你不能用语言结构来转换它。甚至在 PHP 中转换用户定义的对象也是不可能的。

所以你要自己写逻辑。 serialize() 对象有一些奇特的方法,更改类名并再次 unserialize() 以自动执行该过程。

您也可以使用反射编写一个转换函数。但一切都需要用户逻辑。

另请参阅关于 SO 的这篇文章:Type casting for user defined objects

因此,如果您真的喜欢转换对象,我最终使用了这个函数 (see it in action):

function cast($to, $obj)
{
    $toLength = strlen($to);
    $serializedObj = preg_replace('/^O:\\d+:"[^"]+"/', 'O:' . $toLength . ':"' . $to . '"', serialize($obj));

    $serializedObj = preg_replace_callback('/s:(\\d+):"([^"]+)";(.+?);/', function($m) use($to, $toLength) {
        $propertyName = $m[2];
        $propertyLength = $m[1];

        if(strpos($m[2], "\0*\0") === false && ($pos = strrpos($m[2], "\0")) !== false) {
            $propertyName = "\0" . $to . "\0" . substr($m[2], $pos + 1);
            $propertyLength = ($m[1] + $toLength - $pos + 1);
        }

        return 's:' . $propertyLength . ':"' . $propertyName . '";' . $m[3] . ';';
    }, $serializedObj);

    return unserialize($serializedObj);
}

$user = array(
    'id'=> 2,
    'fname' => 'FirstName',
    'lname' => 'LastName',
    'username' => 'UserName'
);

$userObj = cast(User::class, (object)$user);

print_r($userObj);

但我永远不会在生产中使用这个功能。这只是一个实验性的东西。

更新

好吧,我重新考虑了 Java 中转换的处理方式。在 Java 中,您实际上可以从一个对象转换为它的子对象。您不能从任何对象转换到任何其他对象。

因此您可以在 Java 中执行此操作:

$apple = new Apple();
$macintoshApple = (MacintoshApple)$apple;

鉴于 MacintoshApple extends Apple

但是你不能像这样转换两个不相关的对象:

$apple = new Apple();
$pear = (Pear)$apple;

关于php - 有没有办法将数组转换为类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30353105/

相关文章:

php - 如何将数组添加到数组中成为二维数组?

php - 如果数组的大小大于 1

c# - 简单的 LinQ 问题 : convert [][] to []

用于存储体素/ block 类型的 Java 与 XML Lua

python - Python 中的另一个类可以调用一个函数返回的内容吗?

php - 自动加载功能

php - 使用 IPN 验证 PayPal 付款

php - 当我知道客户端的文件路径时如何上传文件?

c - 如何循环遍历头文件中声明的数组?

python - 从字符串中提取二维列表