我不是一个PHP开发人员,所以我不知道如果PHP是比较流行的使用显式的getter/setter方法,在纯OOP的风格,与私人领域(我喜欢的方式):
class MyClass {
private $firstField;
private $secondField;
public function getFirstField() {
return $this->firstField;
}
public function setFirstField($x) {
$this->firstField = $x;
}
public function getSecondField() {
return $this->secondField;
}
public function setSecondField($x) {
$this->secondField = $x;
}
}
Run Code Online (Sandbox Code Playgroud)
或只是公共领域:
class MyClass {
public $firstField;
public $secondField;
}
Run Code Online (Sandbox Code Playgroud)
谢谢
除非我完全弄错了,否则这些__get和__set方法应该允许重载→ get和set.
例如,以下语句应调用该__get方法:
echo $foo->bar;
$var = $foo->bar;
Run Code Online (Sandbox Code Playgroud)
以下应该使用该__set方法:
$foo->bar = 'test';
Run Code Online (Sandbox Code Playgroud)
这在我的代码中不起作用,并且可以通过这个简单的示例重现:
class foo {
public $bar;
public function __get($name) {
echo "Get:$name";
return $this->$name;
}
public function __set($name, $value) {
echo "Set:$name to $value";
$this->$name = $value;
}
}
$foo = new foo();
echo $foo->bar;
$foo->bar = 'test';
echo "[$foo->bar]";
Run Code Online (Sandbox Code Playgroud)
这只会导致:
[test]
Run Code Online (Sandbox Code Playgroud)
die()在那里打几个电话表明它根本没有打它.
现在,我只是说它,并且我手动使用__get它现在需要的地方,但这不是非常动态,并且需要知道"重载"代码实际上没有被调用,除非特别调用.我想知道这是不应该以我理解它应该或为什么这不起作用的方式起作用.
这是在运行php 5.3.3.
好吧,这真的让我烦恼,我开始认为这一切都取决于个人选择,而不是提高效率或编写更好的代码的特定方式:我应该还是不应该在PHP项目中使用getter/setter方法?到目前为止,我读过的答案相当矛盾,并不完全适合PHP,这不是一种编译语言.例如,在Stack Overflow上讨论这个问题(" 为什么要使用getter和setter?").关于为什么我应该在我的代码中使用它们有很多很好的理由,但是所有的儿童评论都提到了访问者是如何邪恶的并且应该避免,在几个更令人不安的评论之间穿插,提到它们应该完全避免,因为它"搞砸你的代码".
我得到的只是相互矛盾的答案,其中没有一个与解释的PHP环境相关.有人可以阐明为什么/为什么不在PHP中使用它们,以及它们的决定背后的理由?如果我们可以简单地将属性定义为私有或受保护并且无论如何:
封装吸气剂和定型器提供的是可笑的薄
...引自"sbi"(为什么要使用吸气剂和二传手?)
就个人而言,我仍然不知道如何:
Class Foo {
public $bar;
function setBarType($val) {
$this->bar = $val;
}
}
$fee = new Foo();
$fee->setBarType(42);
Run Code Online (Sandbox Code Playgroud)
优于此:
Class Foo {
public $bar;
}
$fee = new Foo();
$fee->bar = 42;
Run Code Online (Sandbox Code Playgroud)