使用新数组我这样做:
$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.
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)
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)
你可以使用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)
你也可以尝试这种方式.
<?php
$obj = json_decode("{}");
var_dump($obj);
?>
Run Code Online (Sandbox Code Playgroud)
输出:
object(stdClass)#1 (0) { }
Run Code Online (Sandbox Code Playgroud)
使用通用对象并将键值对映射到它。
$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)
正如其他人指出的,您可以使用 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 版本中向随机对象添加属性的功能,我认为它只适用于某些对象,但我无论如何都不建议使用该功能。
小智 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)
如果您想创建具有动态属性的对象(如在 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)
| 归档时间: |
|
| 查看次数: |
339522 次 |
| 最近记录: |