PHP getter和setter

时间:2014-05-16 13:12:10

标签: php getter

我有一个班级:

class Test
{
    public $AppCount;
    public $Apps;

    // When $AppCount is accessed I want to return count( $this->Apps )
}

当我访问媒体资源$AppCount时,我想返回count( $this->Apps )

我可以使用像C#和Java这样的getter函数,而不必为此属性声明一个公开函数并使其成为私有函数吗?

显然__get不是我想要的,因为该属性已经存在。

评论

我有这个,当我尝试访问该属性时它不会运行该函数:

class ProjectSettingsViewModel
{
    public $ProjectAppCount = 0;
    public $ProjectApps = array();

    public function __get( $property )
    {
        switch( $property )
        {
            case "ProjectAppCount":
                return count( $this->ProjectApps );
                break;
        }
    }
}

如果代码看起来没问题,那一定是其他问题。

2 个答案:

答案 0 :(得分:3)

不幸的是,PHP没有你所指的getter和setter语法。 It has been proposed,但它还没有进入PHP(还)。

首先,__get()仅在您尝试访问无法访问的属性时执行(因为它是protectedprivate,或者因为它不是存在)。如果您正在调用public的媒体资源,则永远不会执行__get()

但是,除非你别无选择,否则我不建议使用PHP的魔法吸气剂和设定器。它们速度较慢,很快就会成为一个很长的if / elseif / else混乱,并且代码完成(使用智能IDE)将无法正常工作。普通方法更简单易懂。您还应该阅读this answer

我已经使用了__get()__set()方法一段时间(而不是手动创建的getFoo()setFoo()方法),因为它似乎是个好主意,但是我在短时间内改变了主意。

因此,在您的情况下,我建议编写常规方法:

<?php

class Test
{
    /**
     * @var App[]
     */
    private $apps;

    /**
     * Returns an array containing all apps
     *
     * @return App[]
     */
    public function getApps()
    {
        return $this->apps;
    }

    /**
     * Returns the number of apps
     *
     * @return integer
     */
    public function getAppsCount() //or call it countApps()
    {
        return count($this->apps);
    }
}

答案 1 :(得分:0)

未经测试..应该可以工作。使用更多魔术方法。

class ProjectSettingsViewModel
{
    protected $ProjectAppCount = 0;
    public $ProjectApps = array();

    public function __get( $property )
    {
        switch( $property )
        {
            case "ProjectAppCount":
                return count( $this->ProjectApps );
                break;
        }
    }
}