class A { public $myPropertyOne = ''; public $myPropertyTwo = ''; ... }
我最喜欢的方式当然是让这些成员私有并为每个属性创建get / set方法.即
class A { private $myPropertyOne = ''; private $myPropertyTwo = ''; public function getMyPropertyOne() { return $this->myPropertyOne; } public function setMyPropertyOne($myPropertyOne) { $this->myPropertyOne = $myPropertyOne; } public function getMyPropertyTwo() { return $this->myPropertyTwo; } public function setMyPropertyTwo($myPropertyTwo) { $this->myPropertyTwo = $myPropertyTwo; } }
但考虑到一个类将有20个属性,我将除了添加40个方法.我在这里关心的是这将如何减慢脚本和更多的记忆这将需要(记住我将有这样的几个类).
另一个解决方案可能是使用魔术函数__set,__get但是我不想,因为开发IDE中的代码完成不会建议对我来说至关重要的属性.
如果这将是一个编译语言(如C),我将不会有问题,并将使用getter,setter的解决方案,但由于PHP是解释语言,我对我的脚本感兴趣,使用较少的RAM并尽可能快.
提前感谢,关于这个问题的任何想法将不胜感激!
我的想法
感谢大家的答案,我只想分享一下我的意见,以防有人会找到这个问题的答案.
我不能完全同意你不应该关心性能的人,因为这是优化工作的任务,我认为这是重要的因素(至少对我而言),当我们处理诸如PHP这样的解释性语言时,我们将永远不得不考虑内存和速度(这一切都提醒我,当我正在开发DOS系统应用程序的时候,呃:)你总是受限于cpu和千字节的总内存不足,所以如果你可以保存一个额外的字节),在PHP开发中,您拥有相同的图片,无论您添加多少个服务器,用户的计数总是会更高,以便您始终必须决定是否要遵循经典/安全/正确的方法或避免这种情况获得一些速度或记忆的增益.
所以….我的意见是,这里的最好的方法是使用所有成员的公共访问,并避免所有属性的getter / setter,并使用get / set方法的私有访问需要数据验证或初始化的属性,然后一个值将被设置.
例如:
class B { public $myPropertyOne = ''; public $myPropertyTwo = ''; private $myPropertyThree = array(); public function getMyPropertyThree() { return $this->myPropertyThree; } public function setMyPropertyThree($val) { if(!is_array($val)) { return; } $this->myPropertyThree = $val; } }
谢谢你花时间在我的问题!
没有办法的类:
class Test1 { }
20类方法:
class Test2 { function test1() { return true; } function test2() { return true; } function test3() { return true; } function test4() { return true; } function test5() { return true; } function test6() { return true; } function test7() { return true; } function test8() { return true; } function test9() { return true; } function test10() { return true; } function test11() { return true; } function test12() { return true; } function test13() { return true; } function test14() { return true; } function test15() { return true; } function test16() { return true; } function test17() { return true; } function test18() { return true; } function test19() { return true; } function test20() { return true; } }
测试循环,两个测试相同:
$test = array(); $base = memory_get_usage(); for ($i = 0; $i < 10000; $i++) { $test[] = new ClassToBeTested(); } $used = memory_get_usage() - $base; print("used: $used\n");
Test1类的结果(无方法):
used: 3157408
Test2类的结果(20种方法):
used: 3157408
我已经在两个单独的脚本中运行它,因为在单个脚本中运行两个测试显然暴露了一些PHP内部分配,第二个测试比第一个测试消耗的内存少,无论是第一个还是第二个.
虽然您确实需要更多的内存来实际的类定义,但显然这个成本只是每个类产生一次,而不是每个实例.您不必担心内存使用情况.