PHP:is_array在不应该返回false时返回false

时间:2013-03-01 12:02:40

标签: php arrays conditional-statements

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

$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
)

3 个答案:

答案 0 :(得分:13)

$user是一个不是数组的对象。 print_r()仍然会将它看起来很好看,但是如果你仔细观察输出,你会看到并不是所有的都会说数组,它会列出对象。您应该使用is_object()

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

答案 1 :(得分:2)

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

但是,紧随其后的代码是$user->name,这意味着您实际上希望它是一个对象。 <{1}}对于对象不会返回true。

如果您想测试它是否为对象,可以使用is_object()代替is_array()

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

is_array()

(其中'myUserClass'显然是你的用户类的类名)

希望有所帮助。

[编辑]

在一个好的系统中,应该知道任何给定对象所期望的类名,并使用$thisUserName = ($user instanceof myUserClass) ? $user->name : $user 来验证它。

但如果您不知道期望的班级名称,那么instanceof就足够了。

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

答案 2 :(得分:0)

如果您正在使用object,请尝试此示例

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

//结果:my_name