php doc method,php magic method 的具体应用和 phpdoc 结合

关于 Magic Methods 的介绍自行查阅官方文档,这里不再赘述。

http://php.net/manual/en/lang...

使用 phpstorm 的同学注意了,如果在我们的代码中使用到了 php 中相关的魔术方法,需要在 php 文件中指明告诉 phpstorm 应该如何来跟踪变量属性。下面我们来具体实践分析。

假设现在我有一个 php 的基类名为 BaseController.php

namespace Conduit\Controllers;

use Psr\Container\ContainerInterface;

/**

* Class BaseController

* @package Conduit\Controllers

*/

class BaseController

{

/** @var \Interop\Container\ContainerInterface */

protected $container;

/** @var \Conduit\Services\Auth\Auth */

private $auth;

/** @var \Conduit\Validation\Validator */

private $validator;

/** @var \League\Fractal\Manager */

private $fractal;

/**

* BaseController constructor.

* @param ContainerInterface $container

*/

public function __construct (ContainerInterface $container)

{

$this->container = $container;

}

/**

* @param $name

* @return mixed

*/

public function __isset ($name)

{

return $this->container->{$name};

}

/**

* @param $name

* @param $value

* @return mixed

*/

public function __set ($name, $value)

{

return $this->container->{$name} = $value;

}

/**

* @param $name

* @return mixed

*/

public function __get ($name)

{

return $this->container->{$name};

}

}

同时还有一个 CompanyController.php 的类文件继承的该 BaseController.php

namespace Conduit\Controllers\Company;

class CompanyController extends BaseController

{

public function getSpecialSubs (Request $request, Response $response)

{

$couser = $this->auth->requestUser($request);

}

}

这里我们主要要关注的点就是 $this->auth 这个,因为这个才是我们今天要将的重点。这里再说一点,列举的代码是基于 slim framework 中的一部分,有不了解 slim framework 的可以先了解下。当然不了解也不影响我们今天要说的这一点。下面是正题。

这里我想实现的效果就是当我在 CompanyController.php 的方法中要访问这个容器(container)中的 auth,可以直接使用 $this->auth,然后就可以操作auth中的方法和属性等。

那上面我列举的方式是使用 php 语言的 magic methods 这个特性,那有同学就要说了,我直接指定岂不是也可以,答案是肯定的。

namespace Conduit\Controllers;

use Interop\Container\ContainerInterface;

class BaseController

{

/** @var \Interop\Container\ContainerInterface */

protected $container;

/** @var \Conduit\Services\Auth\Auth */

protected $auth;

/** @var \Conduit\Validation\Validator */

protected $validator;

/** @var \Illuminate\Database\Capsule\Manager */

protected $db;

/** @var \League\Fractal\Manager */

protected $fractal;

/** @var \SlimSession\Helper */

protected $session;

/**

* BaseController constructor.

*

* @param \Interop\Container\ContainerInterface $container

*/

public function __construct(ContainerInterface $container)

{

$this->container = $container;

$this->auth = $this->container->get('auth');

$this->validator = $this->container->get('validator');

$this->fractal = $this->container->get('fractal');

$this->session = $this->container->get('session');

$this->db = $this->container->get('db');

}

效果就是这个样子。

确实这个样子可以实现,但没有利用到 magic method 这一魔术方法的特性。

这里着重说明的是这个我们定义的这些个类内部属性(这些成员属性必须通过phpdoc 的 @var 来指明你将要调用的成员属性是哪一个不然 phpstorm 不会识别提示)和 __get() 方法,当我们要访问不可访问的属性时会调用该方法。

那所以说 $auth | $validator | $db | fractal 等属性我们要在外部自动调用 __get() 方法来访问的话就必须将其访问修饰符设置为 private (php 中的三种修饰符 public protected private),这样我们在外部调用才能自动执行到 __get() 方法,达到同样的目的来调用 $this->auth 等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值