【问题标题】:PHP 5 type hinting (passing array of objects of type A to the function)PHP 5 类型提示(将 A 类型的对象数组传递给函数)
【发布时间】:2013-01-31 22:02:44
【问题描述】:

我有一个接受A 类型参数的函数(在 PHP 5 中):

function f1(A a){...}

我还有一个数组,我从$_POST['val'] 值解码并将其发送到其他函数f2

$array1 =  json_decode(stripslashes($_POST['val']));
f2($array1);

现在我想在 f2 内的每个数组元素上调用 f1

function f2(array $a){
    foreach($a as $element){
        f1($element);
}

但我得到一个错误:

Argument 1 passed to f1() must be an instance of A, instance of stdClass given

当我将if($element instanceof A) 放入f2 时,我得到FALSE,但我可以正确调用$element A 的方法。

如何“告诉”f1 类型正确?

array1 上使用print_rnamesourceIdA 中):

Array
(
[0] => Array
    (
        [name] => connect
        [sourceId] => 12
    )

)

【问题讨论】:

  • stdClass 不是A。它也没有方法。你永远不会从json_decode 中得到A 类型的东西。您需要先从数据中构造您的 A 对象,然后再将它们传递给 f1

标签: php casting type-hinting


【解决方案1】:

json_decode 的输出是 stdClass 类型的对象,因此出现该错误是正常的。在 PHP 中从一种对象类型转换为另一种对象类型并不容易,但您可以使用这个技巧:

function f2(array $a){
    foreach($a as $element){
        f1 ( unserialize ( preg_replace ( "/O:\d+:\"\w+\":(.*)/", "O:1:\"A\":$1", serialize ($element) ) ) )
}

这个肮脏的技巧实际上将 stdClass 转换为 A 类型的对象。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    json_decode 的第二个参数是布尔值,如果需要数组,请将其设置为 'true'。

    $array1 =  json_decode(stripslashes($_POST['val']), true);
    

    还阅读了安全性。轻信从 $_POST 获得的数据是个坏主意。

    【讨论】:

    • 我将其设置为 true,但我的主要问题仍然存在。 $_POST 数据是来自 jQuery/AJAX 的数据,但它是题外话 ;-)
    • 我的标准答案是找出为什么数据应该起作用,而不是 - 打印它(或将它记录到文件中以便您查看),这样您就可以准确地看到您得到了什么.很可能,你并没有得到你的想法,当你看到它时会很明显。
    • @AlisterBulman 只是好奇,在他/她的情况下信任 $_POST 有什么危险?
    • 这取决于数据最终的位置,但是,例如,如果它在没有过滤的情况下进入数据库......xkcd.com/327
    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多