【问题标题】:PHP: is_array is returning false when it should notPHP:is_array 在不应该返回 false 时
【发布时间】:2013-02-15 22:17:08
【问题描述】:

我有这个简单的一行代码:

$thisUserName = is_array($user) ? $user->name : $user;

这里,$thisUserName 是由 $user 给出的,意味着条件 is_array 返回 false,即使 print_r 表明 $user 是一个数组。

任何想法,任何人?

谢谢。

PS。我尝试将其更改为echo is_array($user) ? 'yes' : 'no',它正在回显没有。

编辑:

print_r($user) 给出

stdClass Object
(
    [id] => 169
    [name] => Cedric
    [username] => pulpfiction
    [email] => xxx@gmail.com
    [password] => c22601b4ed1ac11a80955d6c0eeb1933
    [password_clear] => 
    [usertype] => Registered
    [block] => 0
    [sendEmail] => 0
    [gid] => 18
    [registerDate] => 2013-01-30 11:12:10
    [lastvisitDate] => 2013-02-24 19:45:45
    [activation] => 
    [params] => 

    [aid] => 1
    [guest] => 0
)

【问题讨论】:

  • $user 是数组还是实例化对象?因为 $user->name 应该错误是 $user is an array
  • 您确实意识到-> 运算符属于对象,而不是数组,对吧?也许你需要is_object() instead? Or maybe you need to use []` 而不是->
  • var_dump($user) 显示了什么?
  • 如果你想检查数组中的那个用户,那么它可能应该是 in_array。

标签: php arrays conditional-statements


【解决方案1】:

is_array() 检查变量是否为数组。

但是,紧随其后的代码是$user->name,这意味着您实际上期望它是一个对象。 is_array() 不会为对象返回 true。

如果你想测试它是否是一个对象,你可以使用is_object()而不是is_array()

但是,最好检查它是否是您期望的类型的对象,在这种情况下您可以使用instanceof 例如:

$thisUserName = ($user instanceof myUserClass) ? $user->name : $user

(显然,'myUserClass' 是您的用户类的类名)

希望对您有所帮助。

[编辑]

在一个好的系统中,应该知道任何给定对象所期望的类名,并使用instanceof 来验证它。

但如果您不知道期望的类名,那么is_object() 就足够了。

(您可以使用get_class() 找出对象的类名;这对于您自己的目的可能值得了解您正在使用的系统(Drupal?),但使用get_classintanceof 在此上下文中一起实际测试对象;坚持使用 is_object())

【讨论】:

  • 编辑答案以回答 @Jeremy 关于不知道类名的困惑。
  • 感谢@SDC 的解释
【解决方案2】:

如果你使用的是对象,那么试试这个例子

    <?php
    $user->name='my_name';
    echo (is_object($user)) ?$user->name:$user;
    ?>

//结果:我的名字

【讨论】:

    【解决方案3】:

    $user 是一个对象而不是一个数组。 print_r() 仍然会输出漂亮的东西,但是如果您仔细查看输出,您会发现并非所有内容都会显示为数组,它会列出对象。你应该使用is_object()

    $thisUserName = is_object($user) ? $user->name : $user;
    

    【讨论】:

    • 大奖神秘。你怎么猜到 $user 会是这里的一个对象?
    • @Jeremy - -&gt; 语法用于对象。数组使用=&gt;
    • @Jeremy $user-&gt;name 是对象name 的属性$user
    • 我更愿意使用instanceof 来确认对象的实际类,而不仅仅是is_object()
    • @Jeremy 如果您可以发布print_r 的输出,@SDC 可以为您提供使用instanOf 的工作示例,但我们需要知道类的名称。
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2012-05-14
    • 2018-05-23
    • 2013-09-20
    相关资源
    最近更新 更多