哪种更适合在PHP,2D数组或类中使用?我已经列举了一个我的意思的例子。
// Using a class
class someClass
{
public $name;
public $height;
public $weight;
function __construct($name, $height, $weight)
{
$this -> name = $name;
$this -> height = $height;
$this -> weight = $weight;
}
}
$classArray[1] = new someClass('Bob', 10, 20);
$classArray[2] = new someClass('Fred', 15, 10);
$classArray[3] = new someClass('Ned', 25, 30);
// Using a 2D array
$normalArray[1]['name'] = 'Bob';
$normalArray[1]['height'] = 10;
$normalArray[1]['weight'] = 20;
$normalArray[2]['name'] = 'Fred';
$normalArray[2]['height'] = 15;
$normalArray[2]['weight'] = 10;
$normalArray[3]['name'] = 'Ned';
$normalArray[3]['height'] = 25;
$normalArray[3]['weight'] = 30;
假设某人没有出来并且表明课程太慢,看起来类似于胜利。
我不知道我应该接受哪个答案,我刚刚赞成所有答案。
我现在写了两个几乎相同的页面,一个使用2D数组(在发布此问题之前编写),现在一个使用类,我必须说该类产生更好的代码。我不知道将产生多少开销,但我怀疑它将与代码本身的改进相媲美。
感谢您帮助我成为更好的程序员。
答案 0 :(得分:9)
您在上面构建的“类”是大多数人在其他语言中使用 struct 的原因。我不确定PHP中的性能影响是什么,尽管我怀疑在这里实例化对象的成本可能更高,如果只是一点点。
话虽如此,如果成本相对较低,我认为管理这些对象要容易一些。
我只是根据标题和你的问题说出以下内容,但是:
请记住,类也提供了方法和访问控制的优势。因此,如果您想确保人们不会将权重更改为负数,您可以将weight
字段设为私有,并提供一些访问方法,例如getWeight()
和setWeight()
。在setWeight()
内,您可以进行一些值检查,如下所示:
public function setWeight($weight)
{
if($weight >= 0)
{
$this->weight = $weight;
}
else
{
// Handle this scenario however you like
}
}
答案 1 :(得分:4)
这完全取决于你对'更好'的意思。我会采用面向对象的方式(使用类),因为我发现它可以使代码更清晰(至少在我看来)。但是,我不确定该选项的速度惩罚是什么。
答案 2 :(得分:4)
一般来说,我遵循这条规则:
1)如果应用程序的多个部分使用数据结构,请将其设为类。
2)如果您正在使用它来快速处理应用程序的某个部分中的数据,请将其设为2D数组。
答案 3 :(得分:3)
这是我主要考虑的速度,对于比我在这里更复杂的事情,我可能会选择课程,但问题是,课程费用是多少?
这似乎是过早的优化。您的应用程序不会以任何方式获取任何实际性能,但使用类允许您使用getter和setter方法,并且通常会更好地用于代码封装和代码重用。
使用数组会增加读取和维护代码的成本,您无法轻松地对代码进行单元测试,并且具有良好的类结构,其他开发人员应该发现如果需要将其更容易理解
稍后您需要添加其他方法来操作它们,您将无法扩展架构。
答案 4 :(得分:2)
你所拥有的类不是OO术语中的真正类 - 它只是被构造为占用实例变量的空间。
那就是说 - 速度上存在很多问题 - 在你的例子中它只是一种风格。
有趣的一点 - 如果你认为对象是一个真正的“人”类 - 并且想到你可能想要的人类的其他属性和行为 - 那么你会注意到不仅仅是一种风格表现 - 写作代码 - 但速度性能。
答案 5 :(得分:0)
如果您的代码使用了许多对这些属性(名称/身高/体重)进行操作的函数,那么使用class可能是个不错的选择。
答案 6 :(得分:0)
Teifion,如果你只使用类作为数组的替代品,那么你就不用OOP了。 OOP的本质是对象具有知识和责任,实际上可以做事并与其他类合作。您的对象只具有知识,除了空闲存在之外无法做任何事情,但它们似乎是持久性提供程序(知道如何在数据库中存储/检索数据的对象)的良好候选者。
也不要担心性能。 PHP中的对象快速且轻量级,并且性能通常被高估。使用正确的方法节省您作为程序员的时间比使用一些模糊,难以调试和修复代码来节省程序中的微秒更便宜。
答案 7 :(得分:0)
大多数测试时间数组与类只测试实例化它们。一旦你真正开始用它们做点什么。
我是一个只使用数组的“纯粹主义者”,因为性能要好得多。我写了下面的代码来证明自己能够证明不使用类的额外麻烦(即使它们对程序员来说更容易)
我们只是说我对结果感到非常惊讶!
<?php
$rx = "";
$rt = "";
$rf = "";
$ta = 0; // total array time
$tc = 0; // total class time
// flip these to test different attributes
$test_globals = true;
$test_functions = true;
$test_assignments = true;
$test_reads = true;
// define class
class TestObject
{
public $a;
public $b;
public $c;
public $d;
public $e;
public $f;
public function __construct($a,$b,$c,$d,$e,$f)
{
$this->a = $a;
$this->b = $b;
$this->c = $c;
$this->d = $d;
$this->e = $e;
$this->f = $f;
}
public function setAtoB()
{
$this->a = $this->b;
}
}
// begin test
echo "<br>test reads: " . $test_reads;
echo "<br>test assignments: " . $test_assignments;
echo "<br>test globals: " . $test_globals;
echo "<br>test functions: " . $test_functions;
echo "<br>";
for ($z=0;$z<10;$z++)
{
$starta = microtime(true);
for ($x=0;$x<100000;$x++)
{
$xr = getArray('aaa','bbb','ccccccccc','ddddddddd','eeeeeeee','fffffffffff');
if ($test_assignments)
{
$xr['e'] = "e";
$xr['c'] = "sea biscut";
}
if ($test_reads)
{
$rt = $x['b'];
$rx = $x['f'];
}
if ($test_functions) { setArrAtoB($xr); }
if ($test_globals) { $rf = glb_arr(); }
}
$ta = $ta + (microtime(true)-$starta);
echo "<br/>Array time = " . (microtime(true)-$starta) . "\n\n";
$startc = microtime(true);
for ($x=0;$x<100000;$x++)
{
$xo = new TestObject('aaa','bbb','ccccccccc','ddddddddd','eeeeeeee','fffffffffff');
if ($test_assignments)
{
$xo->e = "e";
$xo->c = "sea biscut";
}
if ($test_reads)
{
$rt = $xo->b;
$rx = $xo->f;
}
if ($test_functions) { $xo->setAtoB(); }
if ($test_globals) { $xf = glb_cls(); }
}
$tc = $tc + (microtime(true)-$startc);
echo "<br>Class time = " . (microtime(true)-$startc) . "\n\n";
echo "<br>";
echo "<br>Total Array time (so far) = " . $ta . "(100,000 iterations) \n\n";
echo "<br>Total Class time (so far) = " . $tc . "(100,000 iterations) \n\n";
echo "<br>";
}
echo "TOTAL TIMES:";
echo "<br>";
echo "<br>Total Array time = " . $ta . "(1,000,000 iterations) \n\n";
echo "<br>Total Class time = " . $tc . "(1,000,000 iterations)\n\n";
// test functions
function getArray($a,$b,$c,$d,$e,$f)
{
$arr = array();
$arr['a'] = $a;
$arr['b'] = $b;
$arr['c'] = $c;
$arr['d'] = $d;
$arr['d'] = $e;
$arr['d'] = $f;
return($arr);
}
//-------------------------------------
function setArrAtoB($r)
{
$r['a'] = $r['b'];
}
//-------------------------------------
function glb_cls()
{
global $xo;
$xo->d = "ddxxdd";
return ($xo->f);
}
//-------------------------------------
function glb_arr()
{
global $xr;
$xr['d'] = "ddxxdd";
return ($xr['f']);
}
//-------------------------------------
?>
测试读数:1 测试任务:1 测试全局:1 测试功能:1
阵列时间= 1.58905816078 上课时间= 1.11980104446 总阵列时间(到目前为止)= 1.58903813362(100,000次迭代) 总课时(到目前为止)= 1.11979603767(100,000次迭代)
数组时间= 1.02581000328 上课时间= 1.22492313385 总阵列时间(到目前为止)= 2.61484408379(100,000次迭代) 总课时(到目前为止)= 2.34471416473(100,000次迭代)
阵列时间= 1.29942297935 上课时间= 1.18844485283 总阵列时间(到目前为止)= 3.91425895691(100,000次迭代) 总课时(到目前为止)= 3.5331492424(100,000次迭代)
数组时间= 1.28776097298 上课时间= 1.02383089066 总阵列时间(到目前为止)= 5.2020149231(100,000次迭代) 总课时(到目前为止)= 4.55697512627(100,000次迭代)
阵列时间= 1.31235599518 上课时间= 1.38880181313 总阵列时间(到目前为止)= 6.51436591148(100,000次迭代) 总课时(目前为止)= 5.94577097893(100,000次迭代)
阵列时间= 1.3007349968 上课时间= 1.07644081116 总阵列时间(到目前为止)= 7.81509685516(100,000次迭代) 总课时(到目前为止)= 7.02220678329(100,000次迭代)
阵列时间= 1.12752890587 上课时间= 1.07106018066 总阵列时间(到目前为止)= 8.94262075424(100,000次迭代) 总课时(到目前为止)= 8.09326195717(100,000次迭代)
数组时间= 1.08890199661 上课时间= 1.09139609337 总阵列时间(到目前为止)= 10.0315177441(100,000次迭代) 总课时(到目前为止)= 9.18465089798(100,000次迭代)
阵列时间= 1.6172170639 上课时间= 1.14714384079 总阵列时间(到目前为止)= 11.6487307549(100,000次迭代) 总课时(到目前为止)= 10.3317887783(100,000次迭代)
数组时间= 1.53738498688 上课时间= 1.28127002716 总阵列时间(到目前为止)= 13.1861097813(100,000次迭代) 总课时(目前为止)= 11.6130547523(100,000次迭代)
总时间: 总阵列时间= 13.1861097813(1,000,000次迭代) 总课时= 11.6130547523(1,000,000次迭代)
所以,无论哪种方式,差异都可以忽略不计。我非常高兴地发现,一旦你开始全局访问,类实际上会变得更快一些。
但是不要相信我,为自己而战。我个人现在对在我的高性能应用程序中使用类感到完全有罪。 :d
答案 8 :(得分:0)
@Richard Varno
我跑完你的确切代码(在修复了小错误之后),并得到了与你不同的结果。我的PHP 5.3.17安装上运行了很多类。
阵列时间= 0.69054913520813 上课时间= 1.1762700080872
总阵列时间(到目前为止)= 0.69054508209229(100,000次迭代) 总课时(到目前为止)= 1.1762590408325(100,000次迭代)
阵列时间= 0.99001502990723 上课时间= 1.22034907341
总阵列时间(到目前为止)= 1.6805560588837(100,000次迭代) 总课时(目前为止)= 2.3966031074524(100,000次迭代)
阵列时间= 0.99191808700562 上课时间= 1.2245700359344
总阵列时间(到目前为止)= 2.6724660396576(100,000次迭代) 总课时(到目前为止)= 3.6211669445038(100,000次迭代)
阵列时间= 0.9890251159668 上课时间= 1.2246470451355
总阵列时间(到目前为止)= 3.661484003067(100,000次迭代) 总课时(到目前为止)= 4.8458080291748(100,000次迭代)
阵列时间= 0.99573588371277 上课时间= 1.1242771148682
总阵列时间(到目前为止)= 4.6572148799896(100,000次迭代) 总课时(到目前为止)= 5.9700801372528(100,000次迭代)
阵列时间= 0.88518786430359 上课时间= 1.1427340507507
总阵列时间(到目前为止)= 5.5423986911774(100,000次迭代) 总课时(到目前为止)= 7.1128082275391(100,000次迭代)
阵列时间= 0.87605404853821 上课时间= 0.95899105072021
总阵列时间(到目前为止)= 6.4184486865997(100,000次迭代) 总课时(到目前为止)= 8.0717933177948(100,000次迭代)
数组时间= 0.73414516448975 上课时间= 1.0223190784454
总阵列时间(到目前为止)= 7.1525888442993(100,000次迭代) 总课时(到目前为止)= 9.0941033363342(100,000次迭代)
阵列时间= 0.95230412483215 上课时间= 1.059828042984
总阵列时间(到目前为止)= 8.1048839092255(100,000次迭代) 总课时(到目前为止)= 10.153927326202(100,000次迭代)
阵列时间= 0.75814390182495 上课时间= 0.84455919265747
总阵列时间(到目前为止)= 8.8630249500275(100,000次迭代) 总课时(目前为止)= 10.998482465744(100,000次迭代) 总时间:
总阵列时间= 8.8630249500275(1,000,000次迭代) 总课时= 10.998482465744(1,000,000次迭代)