PHPStorm 中的魔术方法,魔术属性支持
首先搞清楚为什么要用魔术方法,实际上魔术系列主要作用还是提供程序设计灵活性和语言表达能力,减去你写大量的样板代码,但是这种运行时解释,会让读代码的人很抓头。
比如 __call
__get
__get
等等,用了以后IDE支持变得很差,因为IDE根本捕捉不到意图,魔术系列都是在运行时动态解释的。
如何解决这个问题呢?我们可以使用 phpdoc 来缓解这个问题,PHPStorm 对此提供了良好的支持。
相关的 doc 介绍:
魔术方法
https://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.method.pkg.html
/**
* show off @method
*
* @method int borp() borp(int $int1, int $int2) multiply two integers
*/
class Magician
{
function __call($method, $params)
{
if ($method == 'borp') {
if (count($params) == 2) {
return $params[0] * $params[1];
}}}}
魔术属性
https://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.property.pkg.html
/**
* show off @property, @property-read, @property-write
*
* @property mixed $regular regular read/write property
* @property-read int $foo the foo prop
* @property-write string $bar the bar prop
*/
class Magician
{
private $_thingy;
private $_bar;
function __get($var)
{
switch ($var) {
case 'foo' :
return 45;
case 'regular' :
return $this->_thingy;
}}
function __set($var, $val)
{
switch ($var) {
case 'bar' :
$this->_bar = $val;
break;
case 'regular' :
if (is_string($val)) {
$this->_thingy = $val;
}}}
}
怎么用呢?很简单,在你的类的注释上打上 @method 注释,然后你的IDE就可以完美支持代码补全了。