gpt4 book ai didi

PHP OOP 有很多 setter、getter

转载 作者:行者123 更新时间:2023-12-04 13:17:43 24 4
gpt4 key购买 nike

我需要创建大约。 5-7个类,每个类将包含很多成员(假设每个类将包含20个成员)。我可以使用公共(public)访问来创建它们,例如:

class A {
public $myPropertyOne = '';
public $myPropertyTwo = '';
...
}

当然,我更喜欢将这些成员设为私有(private)并为每个属性创建 get/set 方法。 IE。
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 和千字节的总 RAM,所以如果你能节省额外的钱,你会很高兴byte),在 PHP 开发中,无论添加多少台服务器,您都拥有相同的画面,用户数将始终更高,因此您始终必须决定是要遵循经典/安全/正确的方法还是避免这种情况和在速度或内存方面获得一些 yield 。

所以....我的观点是,这里最好的方法是对所有成员使用公共(public)访问,并避免对所有属性使用 getter/setter,并使用私有(private)访问和 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 内部分配,并且第二个测试消耗的内存比第一个测试少,无论哪个是第一个或第二个。

虽然您肯定会为实际的类定义占用更多内存,但显然每个类只产生一次这种成本,而不是每个实例。您不必担心内存使用情况。

关于PHP OOP 有很多 setter、getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11167709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com