关于 Magic Methods 的介绍自行查阅官方文档,这里再也不赘述。
http://php.net/manual/en/lang...php
使用 phpstorm 的同窗注意了,若是在咱们的代码中使用到了 php 中相关的魔术方法,须要在 php 文件中指明告诉 phpstorm 应该如何来跟踪变量属性。下面咱们来具体实践分析。session
假设如今我有一个 php 的基类名为 BaseController.phpphpstorm
<?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.phpoop
<?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 的能够先了解下。固然不了解也不影响咱们今天要说的这一点。下面是正题。ui
这里我想实现的效果就是当我在 CompanyController.php 的方法中要访问这个容器(container)中的 auth,能够直接使用 $this->auth,而后就能够操做auth中的方法和属性等。
那上面我列举的方式是使用 php 语言的 magic methods 这个特性,那有同窗就要说了,我直接指定岂不是也能够,答案是确定的。this
<?php 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 这一魔术方法的特性。spa
这里着重说明的是这个咱们定义的这些个类内部属性(这些成员属性必须经过phpdoc 的 @var 来指明你将要调用的成员属性是哪个否则 phpstorm 不会识别提示)和 __get() 方法,当咱们要访问不可访问的属性时会调用该方法。
那因此说 $auth | $validator | $db | fractal 等属性咱们要在外部自动调用 __get() 方法来访问的话就必须将其访问修饰符设置为 private (php 中的三种修饰符 public protected private),这样咱们在外部调用才能自动执行到 __get() 方法,达到一样的目的来调用 $this->auth 等.net