SD.*_*SD. 5 php arrays class object type-conversion
有一种方法可以获取类属性并使用(array)强制转换它.
$user = (array) get_object_vars($userObject)
Run Code Online (Sandbox Code Playgroud)
但我想知道,我没有找到任何直接的方法来将数组转换为类属性.
假设我有以下实现的用户类:
class User
{
private $id = 0;
private $fname = '';
private $lname = '';
private $username = '';
}
Run Code Online (Sandbox Code Playgroud)
我有以下数组:
$user = array(
'id'=> 2,
'fname' => 'FirstName',
'lname' => 'LastName',
'username' => 'UserName'
);
Run Code Online (Sandbox Code Playgroud)
我正在寻找像我们一样的类型演员(object).问题是(object)类型转换将数组转换为stdClass对象,但在这里我希望我的数组转换为我指定的类.
这个例子应该表达如下:(我的假设,PHP应该有这个.或者它可能已经有这样的东西,我不知道.)
$userobj = (object User) $user;
Run Code Online (Sandbox Code Playgroud)
上面语法的结果应该是这样的:
$userobj->id = $user['id'];
$userobj->fname = $user['fname'];
$userobj->lname = $user['lname'];
$userobj->username = $user['username'];
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何直接方法,而不是映射逻辑.寻找语言级技巧.
注意:我知道使用foreach以完成上述操作.我正在寻找一些直接的方法,如果在PHP中可用,但尚未成为焦点(可能是!).
以下内容无法解决我的问题: 将stdClass对象转换/转换为另一个类
数组不是对象。所以你不能用语言结构来转换它。即使在 PHP 中强制转换用户定义的对象也是不可能的。
所以你必须编写自己的逻辑。对象有一些奇特的方法serialize(),更改类名并unserialize()再次自动化该过程。
您也可以使用反射编写强制转换函数。但一切都需要用户逻辑。
另请参阅关于 SO 的这篇文章:用户定义对象的类型转换
因此,如果您真的喜欢投射对象,我最终会使用此函数(请参阅实际操作):
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);
Run Code Online (Sandbox Code Playgroud)
但我永远不会在生产中使用这个功能。这只是一个实验性的事情。
更新
好吧,我重新思考了 Java 中如何处理强制转换。在 Java 中,您实际上可以从一个对象转换为其子对象。您不能从任何对象投射到任何其他对象。
所以你可以在 Java 中做到这一点:
$apple = new Apple();
$macintoshApple = (MacintoshApple)$apple;
Run Code Online (Sandbox Code Playgroud)
鉴于MacintoshApple extends Apple。
但是你不能投射两个不相关的对象,例如:
$apple = new Apple();
$pear = (Pear)$apple;
Run Code Online (Sandbox Code Playgroud)