OsBen
@OsBen
Печатай больше года, что бы запомнить больше кода

Организовать phpDoc для __get property где property это экземпляр класса, как?

Все здравствуйте!
Что то не выходить правильно написать phpDoc что бы работал autocomplete в phpstorm.
Ниже приведу сам код.

П.С. Код не мой, переписать не хочется, так как есть много проектов на этом движке.
Base.php
<?php
/**
 * Class Base
 * @property $config
 * @property $request
 * @property $db
 */
Class Base {

	 
	private $classes = array(
		'config'     => 'Config',
		'request'    => 'Request',
		'db'         => 'Database'
	);
	
	private static $objects = array();
	
	public function __get($name)
	{
		// Если такой объект уже существует, возвращаем его
		if(isset(self::$objects[$name]))
		{
			return(self::$objects[$name]);
		}

		// Если запрошенного API не существует - ошибка
		if(!array_key_exists($name, $this->classes))
		{
			return null;
		}

		// Определяем имя нужного класса
		$class = $this->classes[$name];

		// Подключаем его
		include_once(dirname(__FILE__).'/'.$class.'.php');

		// Сохраняем для будущих обращений к нему
		self::$objects[$name] = new $class();

		// Возвращаем созданный объект
		return self::$objects[$name];
	}
}


Config.php
<?php

require_once('Base.php');

class Config
{

	private $vars = array();
	public function __construct()
	{
		//....
	}
	//....
}

Database.php
<?php
require_once('Base.php');

class Database extends Base
{
	private $mysqli;
	private $res;

	public function __construct()
	{
		parent::__construct();
		$this->connect();
	}
	
	public function connect() {/*....*/}
	
	public function query() {/*....*/}
	
	public function placehold() {/*....*/}
	
	//....
}

Request.php
<?php
require_once('Base.php');

class Request extends Base
{

	public function __construct()
	{
		parent::__construct();

		//....

	}
	
	public function method($method = null) {/*....*/}
	
	private function stripslashes_recursive($var) {/*....*/}
	//....
	
}


Спасибо за внимание, буду признателен за помощь.
  • Вопрос задан
  • 1165 просмотров
Решения вопроса 2
nazarpc
@nazarpc
Open Source enthusiast
/**
 * Class Base
 * @property Config $config
 * @property Request $request
 * @property Database $db
 */

Либо я совершенно не понял, что вы спрашиваете.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
Вам магический геттер не нужен, о слова "совсем". Под приватные свойства сделайте геттеры, это вам здорово облегчит жизнь. Да и костыли с док блоками городить не придется.
Рекомендую почитать про SOLID, ваш Base - это божественный объект.
Так же очень настоятельно рекомендую почитать про PSR-4, сейчас никто не пишет свои автолодеры.

На счет dock block property, он объявляется:

/**
 * @property TYPE_HERE VAR_NAME_HERE [DESCRIPTION]
 */


П.С. Код не мой, переписать не хочется, так как есть много проектов на этом движке.

Если есть возможность выбросить этот движок - делайте поскорее, иначе технический долг будет только возрастать, а код очень скоро станет не саппортабельным
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы