【问题标题】:PHP getter and setterPHP getter 和 setter
【发布时间】:2014-06-04 17:28:49
【问题描述】:

我有一堂课:

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 在这种情况下不是我想要的,因为该属性确实已经存在。

对于cmets

我有这个,但当我尝试访问该属性时它不运行该功能:

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

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

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

【问题讨论】:

  • 您可以将__get 与存在的属性一起使用
  • 可以为此使用神奇的__get 方法,但请创建一个Test::getCount() 方法。它被称为 make 是有原因的
  • 1) 如果你把它设为private / protected,它就可以工作。 2)如果你以任何方式计算,该属性是无用的 3)但又一次。 Staph 在你的代码中使用魔法。
  • 我发布了答案,但我第二次@PeeHaa .. 在你的代码中使用魔法很危险。
  • 是的......就像我说的。他是对的。感谢@PeeHaa

标签: php getter


【解决方案1】:

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

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

但是,除非您真的别无选择,否则我不建议使用 PHP 的魔法 getter 和 setter。它们速度较慢,往往很快就会变成一个长长的 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);
    }
}

【讨论】:

    【解决方案2】:

    未经测试.. 不过应该可以。使用更神奇的方法。

    class ProjectSettingsViewModel
    {
        protected $ProjectAppCount = 0;
        public $ProjectApps = array();
    
        public function __get( $property )
        {
            switch( $property )
            {
                case "ProjectAppCount":
                    return count( $this->ProjectApps );
                    break;
            }
        }
    }
    

    【讨论】:

    • 呃,这真的是 PHP 处理属性的方式吗?
    • @LightnessRacesinOrbit 否。这就是一些开发人员处理属性的方式。正如我在回答中解释的那样,这并不是真正推荐的。
    • @LightnessRacesinOrbit 就像问题上的 cmets 解释的那样,魔术是不好的做法。但是,PHP 确实允许您做一些非常愚蠢的事情。
    • @LightnessRacesinOrbit 哈哈哈,摸摸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多