用一个新的数组,我这样做:
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
对象有类似的语法吗
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
#1楼
$x = new stdClass();
手册中的注释总结起来最好:
stdClass是默认的PHP对象。 stdClass没有属性,方法或父级。 它不支持魔术方法,并且不实现任何接口。
当将标量或数组转换为Object时,将获得stdClass的实例。 只要需要通用对象实例,就可以使用stdClass。
#2楼
您有一个糟糕但有用的技术:
$var = json_decode(json_encode([]), FALSE);
#3楼
正如其他人指出的那样,您可以使用stdClass。 但是我认为没有()会更干净,就像这样:
$obj = new stdClass;
但是基于这个问题,看来您真正想要的是能够动态地向对象添加属性。 尽管可以,但您不需要为此使用stdClass。 确实可以使用任何类。 只需创建任何类的对象实例并开始设置属性即可。 我喜欢创建自己的类,其名称仅为o,并提供一些我在这些情况下喜欢使用的基本扩展功能,并且非常适合从其他类进行扩展。 基本上,这是我自己的基础对象类。 我也喜欢简单地命名为o()的函数。 像这样:
class o {
// some custom shared magic, constructor, properties, or methods here
}
function o() {
return new o;
}
如果您不希望拥有自己的基础对象类型,则只需让o()返回新的stdClass。 一个优点是,与将stdClass用作类名,函数名或两者都使用相比,o比stdClass更容易记住并且更短。 即使您的o类中没有任何代码,也要比笨拙的大写stdClass(可能会引用“性传播疾病类”的想法)记忆起来容易。 如果自定义o类,则可能会发现o()函数的用法而不是构造函数的语法。 这是一个正常的函数,它返回一个值,该值比构造方法的限制要少。 例如,函数名称可以作为字符串传递给接受可调用参数的函数。 一个函数还支持链接。 因此,您可以执行以下操作:$ result = o($ internal_value)-> some_operation_or_conversion_on_this_value();
这是基础“语言”构建其他语言层(顶层以完全内部DSL编写)的一个很好的开始。 这类似于lisp的开发风格,PHP对其的支持比大多数人意识到的要好。 我意识到这个问题有点切线,但是这个问题触及到我认为是充分利用PHP功能的基础。
#4楼
除了zombat的答案,如果您一直忘记stdClass
function object(){
return new stdClass();
}
现在您可以执行以下操作:
$str='';
$array=array();
$object=object();
#5楼
要以类似方式访问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};