我一直在使用数组来存储相关字段。如果我想拥有相关的用户字段,我使用了:
$user = array(
'id' => 27
'name' => 'Pepe'
);
但是最近,我一直在使用对象,我更喜欢使用$ user-> id而不是$ user ['id']。
我的问题:要实现面向对象的样式,可以使用stdClass:
$user = new stdClass();
$user->id = 27;
$user->name = 'Pepe';
或从数组中转换
$user = (object) array(
'id' => 27
, 'name' => 'Pepe'
);
其中一个比其他人更好,按性能和风格排序,还是你可以模糊地使用你想要的任何东西?
谢谢!
更新 我同意所有的评论,这根本不是OOP,只是将相关数据分组到一个结构中。我的$ user示例不是最好的,因为它是使用带有方法,属性,blablabla的类的典型示例...我问,因为我有很多配置结构,比如我们“initTable”,我想要类似的东西:< / p>
$table => page => init => 1
=> end => 25
sort => field => name
=> order => asc
依此类推,我想知道获取init页面有什么好处:
$table->page->init **OR** $table['page']['init']
答案 0 :(得分:9)
基于小测试(http://phpfiddle.org/lite/code/cz0-hyf)我可以说使用“new stdClass()”比其他选项慢约3倍。
奇怪的是,与stdClass相比,投射数组非常有效。
但是这个测试只计算执行时间。它不计量内存。
P.S。我只使用phpFiddle来共享代码。测试在我当地的PC上完成。
答案 1 :(得分:6)
尝试调查此问题,此处每项测试每次执行1000,000次:
$start = microtime(true);
for ($i=0;$i<1000000;$i++) {
$user = new stdClass();
$user->id = 27;
$user->name = 'Pepe';
}
$end = microtime(true);
echo $end - $start;
echo '<br><br>';
$start = microtime(true);
for ($i=0;$i<1000000;$i++) {
$user = (object) array(
'id' => 27,
'name' => 'Pepe'
);
}
$end = microtime(true);
echo $end - $start;
报告
0.75109791755676
0.51117610931396
所以 - 显然,在这种特殊情况下 - 从数组中投射是最快的方法。以百分之几击败stdClass
。但我不指望它是一般的普遍规则或法律。
答案 2 :(得分:4)
我不认为将数组移动到标准对象会产生影响。除非您不能再使用大多数array_*
功能。
在索引数组上使用动态对象时,我看不出任何优势。
在这种情况下,我会为你需要的每个元素和属性创建一个类。
class User
{
protected $id;
protected $name;
public function __construct($id = null, $name = null)
{
$this->id = $id;
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
通过这样的设计,您可以确切地知道您拥有的参数类型。
$user = new User(21, 'Foo');
echo $user->getName(); // Foo
$blank = new User(22);
echo $blank->getName(); // NULL
没有错误,没有更多的检查
使用array
或stdClass
,你会有类似的东西
$user = array('id' => 21, 'name' => 'Foo');
echo $user['name']; // Foo
$blank = array('id' => 22);
echo $blank['name']; // NOTICE: Undefined offset
echo isset($blank['name']) ? $blank['name'] : null; // NULL
对于这种行为,拥有一个您知道界面的实体对象更容易维护和扭曲。