如何在PHP中定义一个空对象

ed2*_*209 357 php object

使用新数组我这样做:

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
Run Code Online (Sandbox Code Playgroud)

对象是否有类似的语法

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
Run Code Online (Sandbox Code Playgroud)

zom*_*bat 804

$x = new stdClass();
Run Code Online (Sandbox Code Playgroud)

手册中评论总结得最好:

stdClass是默认的PHP对象.stdClass没有属性,方法或父级.它不支持魔术方法,也不实现接口.

将标量或数组转换为Object时,将获得stdClass的实例.只要需要通用对象实例,就可以使用stdClass.

  • 如果遇到"未找到":`new\stdClass();`[PHP Namespace Doc](http://nl.php.net/manual/en/language.namespaces.basics.php) (23认同)
  • 我只是把"stdClass"作为"标准类"在我脑海里说 (11认同)
  • $ O =(对象)NULL; - 如果将对象转换为对象,则不会对其进行修改.如果将任何其他类型的值转换为对象,则会创建stdClass内置类的新实例.如果值为NULL,则新实例将为空.数组转换为具有按键和相应值命名的属性的对象.对于任何其他值,名为标量的成员变量将包含该值. (5认同)
  • @IvanCastellanos您能解释一下如何从单词AIDS中记住`stdClass()`吗? (3认同)
  • @zombat,括号 `stdClass()` 是什么? (2认同)

cga*_*olo 104

创建"空"对象的标准方法是:

$oVal = new stdClass();
Run Code Online (Sandbox Code Playgroud)

但是,如果PHP> = 5.4,我个人更喜欢使用:

$oVal = (object)[];
Run Code Online (Sandbox Code Playgroud)

它更短,我个人认为它更清晰,因为stdClass可能误导新手程序员(即"嘿,我想要一个对象,而不是一个类!"......).

与PHP <5.4相同的是:

$oVal = (object) array();
Run Code Online (Sandbox Code Playgroud)

(object)[]相当于new stdClass().

请参阅PHP手册(此处):

stdClass:通过类型转换为对象创建的.

和(这里):

如果将对象转换为对象,则不会对其进行修改.如果将任何其他类型的值转换为对象,则会创建stdClass内置类的新实例.


但请记住,空($ oVal)返回false,因为@PaulP说:

没有属性的对象不再被视为空.

关于你的例子,如果你写:

$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates  a Warning here
$oVal->key1->var2 = "something else";
Run Code Online (Sandbox Code Playgroud)

PHP创建以下警告,隐式创建属性key1(对象本身)

警告:从空值创建默认对象

如果您的配置(请参阅错误报告级别)向浏览器显示此警告,则可能会出现问题.这是另一个完整的主题,但快速而肮脏的方法可能是使用错误控制操作符(@)忽略警告:

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";
Run Code Online (Sandbox Code Playgroud)

  • 我非常喜欢简写`(object)[]` (8认同)
  • "个人偏好"!="问题" (6认同)
  • @Pacerier,我不明白你的固执.问题是'如何在PHP中定义一个空对象'.我的回答是正确的,我写信使用"new stdClass()".我提供给用户'ed209'的代码是正确的,我使用了"new stdClass()".此外,我添加了一个个人意见,我用一个大胆的"个人"来清楚,这不是"标准"的方式.在我看来,一个值得这么多评论的问题至少应该是一个错误的答案.相反,如果你认为个人意见是一个问题,也许*这个*是建设性分享想法的问题. (4认同)
  • 而不是解决问题,你正在创建一个新问题.需要修复的问题是人们应该知道`stdClass`的作用. (2认同)
  • 我写了'stdClass`的内容.我在回答问题的代码上使用了`stdClass`.对不起,我不是在创造一个新问题,这是我个人的意见(正如我所写). (2认同)

Pau*_*ulP 34

我想指出在PHP中没有像空对象这样的东西:

$obj = new stdClass();
var_dump(empty($obj)); // bool(false)
Run Code Online (Sandbox Code Playgroud)

但当然$ obj将是空的.

另一方面,空数组在两种情况下均为空

$arr = array();
var_dump(empty($arr));
Run Code Online (Sandbox Code Playgroud)

从changelog函数引用为

没有属性的对象不再被视为空.


Hun*_*der 17

php.net说它是最好的:

$new_empty_object = new stdClass();
Run Code Online (Sandbox Code Playgroud)


cam*_*jos 12

我喜欢在JavaScript中创建匿名类型的对象是多么容易:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value
Run Code Online (Sandbox Code Playgroud)

所以我总是尝试在PHP中编写这种对象,就像javascript一样:

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value
Run Code Online (Sandbox Code Playgroud)

但是因为这基本上是一个数组,你不能做像将js这样的属性分配给属性的事情:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"
Run Code Online (Sandbox Code Playgroud)

嗯,你可以做到,但IMO不实用/干净:

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar
Run Code Online (Sandbox Code Playgroud)

此外,使用这个synthax你可以找到一些有趣的惊喜,但在大多数情况下工作正常.


Raf*_*shi 11

除了zombat的回答,如果你不记得 stdClass

   function object(){

        return new stdClass();

    }
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

$str='';
$array=array();
$object=object();
Run Code Online (Sandbox Code Playgroud)


Amr*_*Amr 7

你可以使用new stdClass()(推荐):

$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);

// outputs:
// stdClass Object ( [name] => John ) 
Run Code Online (Sandbox Code Playgroud)

或者,您可以将空数组转换为生成stdClass内置类的新空实例的对象:

$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);

// outputs: 
// stdClass Object ( [name] => John )  
Run Code Online (Sandbox Code Playgroud)

或者,您可以将null值转换为生成stdClass内置类的新空实例的对象:

$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);

// outputs:
// stdClass Object ( [name] => John ) 
Run Code Online (Sandbox Code Playgroud)


Muk*_*gar 6

你也可以尝试这种方式.

<?php
     $obj = json_decode("{}"); 
     var_dump($obj);
?>
Run Code Online (Sandbox Code Playgroud)

输出:

object(stdClass)#1 (0) { }
Run Code Online (Sandbox Code Playgroud)


Ant*_*ley 6

使用通用对象并将键值对映射到它。

$oVal = new stdClass();
$oVal->key = $value
Run Code Online (Sandbox Code Playgroud)

或将数组转换为对象

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;
Run Code Online (Sandbox Code Playgroud)


sti*_*g_1 5

正如其他人指出的,您可以使用 stdClass。然而,基于这个问题,似乎您真正想要的是能够动态向对象添加属性。尽管可以,但您不需要为此使用 stdClass。实际上你可以使用任何类。只需创建任何类的对象实例并开始设置属性即可。我喜欢创建自己的类,其名称只是 o 以及一些我喜欢在这些情况下使用的基本扩展功能,并且很适合从其他类进行扩展。基本上它是我自己的基础对象类。我还喜欢一个简单地命名为 o() 的函数。就像这样:

class o {
  // some custom shared magic, constructor, properties, or methods here
}

function o() {
  return new o();
}
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢拥有自己的基本对象类型,您可以简单地让 o() 返回一个新的 stdClass。一个优点是 o 比 stdClass 更容易记住并且更短,无论您是否将其用作类名、函数名或两者。即使您的 o 类中没有任何代码,它仍然比笨拙的大写和命名的 stdClass(这可能会引发“性传播疾病类”的想法)更容易记住。如果您确实自定义了 o 类,您可能会发现可以使用 o() 函数而不是构造函数语法。它是一个返回值的普通函数,其限制比构造函数少。例如,函数名称可以作为字符串传递给接受可调用参数的函数。函数还支持链接。所以你可以这样做: $result= o($internal_value)->some_operation_or_conversion_on_this_value();

对于基础“语言”来说,这是一个很好的开始,可以在其上构建其他语言层,并且顶层是用完整的内部 DSL 编写的。这类似于 Lisp 开发风格,并且 PHP 对它的支持比大多数人意识到的要好。我意识到这有点离题,但这个问题触及了我认为充分利用 PHP 的强大功能的基础。

编辑/更新:我不再推荐这些。它使得静态分析工具和 IDE 以及基于 AST 的自定义工具难以理解、验证、帮助您查找或编写代码。一般来说,魔法是不好的,除非在某些情况下,如果您能够让您的工具理解魔法,并且您以足够标准的方式进行操作,即使标准社区工具也能理解它,或者如果您的工具非常先进且功能齐全,以至于你只使用你自己的工具。另外,我认为他们不赞成在即将推出的 PHP 版本中向随机对象添加属性的功能,我认为它只适用于某些对象,但我无论如何都不建议使用该功能。

  • @Pacerier 你的意思是没有括号吗?;) http://www.cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html (2认同)

小智 5

以与使用asociative数组类似的方式访问stdClass中的数据只需使用{$ var}语法.

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};
Run Code Online (Sandbox Code Playgroud)


fre*_*tma 5

如果您想创建具有动态属性的对象(如在 javascript 中),而不收到未定义属性的警告。

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

public function __set($name, $value) {
    $this->{$name} = $value;
}

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null
Run Code Online (Sandbox Code Playgroud)