我有一个班级:
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;
}
}
}
如果代码看起来没问题,那一定是其他问题。
答案 0 :(得分:3)
不幸的是,PHP没有你所指的getter和setter语法。 It has been proposed,但它还没有进入PHP(还)。
首先,__get()
仅在您尝试访问无法访问的属性时执行(因为它是protected
或private
,或者因为它不是存在)。如果您正在调用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;
}
}
}