PHP中的Setters / Getters,Visibility [OOP]

Setters/Getters, Visibility [ OOP ] in PHP

我正在重新格式化我的类(见下文)-我认为我犯了一个错误,就是在我的类中设置了具有相同可见性的所有内容,而属性实际上应该是私有的,并且getter/setter在大多数情况下应该是公共的。

要获取一个属性,我只需要执行$path->propertyname,但是我注意到使用setter/getter更为实用。如果要实现getter,应该为每个属性生成一个getter,还是可以为整个类生成一个getter?比如说我想得到控制器的名字…

1
2
3
public function getController( ) {
    return $this->controller;
}

那会归还控制器的私有财产吗?有一个更通用的getter/setter或者甚至一个为我获取和设置的混合方法是常见的吗?

这是类结构(只是属性/方法):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class urlParser {

    public static $url      = '';
    public static $controller   = '';
    public static $baseController = '';
    public static $urls     = '';
    public static $template     = '';
    public static $captures     = '';
    public static $contentXML   = '';

    function __construct( $urls ) {

        $this->urls = $urls;

        $this->baseController = $urls['default'];

        $this->get_url();
    }

    public function get_url() {
        // sets following properties:
        // url, template, controller, contentXML, baseController
    }
}


在你的例子中有setter和getter是没有意义的。

如果除了返回控制器之外,您还需要做任何事情,那么您不需要getter,因为如果在设置属性之后不使用它,那么您不需要setter。

如果你真的想要getter和setter,你可以为你的所有属性使用get和set magic方法。但如果情况如我上面所描述的那样,那是完全没有意义的。


PHP对象有一些很好的魔术方法(尽管我并没有全部使用它们,因为它会变得混乱)。您可能要查找的是uuget()和u set()。如果您选择将数据字段设为私有(这样您就不必让其他代码错误地访问字段),那么仍然需要重构所有代码。这样做有助于使代码变得更好和更容易维护。

尽管如此,我通常尝试为每个私有数据字段设置getter和setter,因为您可以很容易地看到每个字段的任何验证。另外,我更像Java开发人员而不是PHP开发人员。


看看php中的重载:http://php.net/overload

有两种神奇的方法:__get()__set(),它们可以完全满足你的需要。