Уважаемые посетители форума, столкнулся с такой проблемой, пытаюсь разобраться в скрипте уперся в одну строку которая не дает мне понять, что и как дальше понимать. Перейду к изложению проблемки. Есть сайт сосотоящий из 4 скриптов первый скрипт index.php находится в корне сайта выполняет роль роутера на сайте вот его код Код (PHP): <?php ini_set('display_errors', 1); ini_set('error_reporting', -1); if (!class_exists('Core')) { require_once 'core/Core.php'; } $Core = new Core(); $req = !empty($_REQUEST['q']) ? trim($_REQUEST['q']) : ''; $Core->handleRequest($req); ?> второй скрипт это скрипт ядра сайта Core.php привожу его код Код (PHP): <?php class Core { public $config = array(); /** * Конструктор класса * * @param array $config */ function __construct(array $config = array()) { $this->config = array_merge( array( 'controllersPath' => dirname(__FILE__) . '/controllers/', ), $config ); } /** конструктор при объявлении объекта класса core принимает параметры которые он принимает в виде массива и передает эти параметры в публичный член в виде массива $config слитого с массивом array которому назначены данные в виде ключа controllersPath=> dirname(_FILE_) . '/controllers/', то есть в публичном члене public $config=" хранится controllersPath=> dirname(_FILE_) . '/controllers/', и те параметры которые передаются при объявление нового объекта класса Core " **/ /** * Обработка входящего запроса * * @param $uri */ /** в обязательном параметре $uri к нам поступает адресная строка mysite.ru/test **/ public function handleRequest($uri) { /** далее в переменную $request мы посредством функции exlode разбираем $uri разделителем тут является '/' который указан первым параметром explode **/ $request = explode('/', $uri); /** в переменную $name присваивается нулевое значение массива $request разбитого функцией explode и тут же функцией ucfirst первая буква становится заглавной **/ $name = ucfirst($request[0]); /** далее в переменную $file мы посредством $this обращаемся к значению массива $config ['controllersPath'] в котором прописан путь к директории где у нас находятся контроллеры, затем присоединяем к этому пути значение переменной $name в которой у нас содержится значение нулевого ключа Request и присоединяем к этому всему раширение php **/ $file = $this->config['controllersPath'] . $name . '.php'; /** если значению в $file нет идентичного по названию которому нет в директории /controllers/ то тогда функция переводит нас на класс ['controllersPath'] . 'Home.php'; то есть _dir name_/controllers/Home.php и тогда переменной class мы определяем значение Controllers_Home, а иначе переменной $class присваивается значение =Controllers_+$name то есть если значение у $name=Test то значением $class='Controllers_Test' **/ // Если нужного контроллера нет, то используем контроллер Home if (!file_exists($file)) { $file = $this->config['controllersPath'] . 'Home.php'; // Определяем имя класса, согласно принятым у нас правилам $class = 'Controllers_Home'; } else { $class = 'Controllers_' . $name; } /** если такой класс не определен то загружааем его **/ // Если контроллер еще не был загружен - загружаем его if (!class_exists($class)) { require_once $file; } // И запускаем /** @var Controllers_Home|Controllers_Test $controller */ $controller = new $class($this); // Передавая экземпляр текущего класс в него - $this $response = $controller->run(); echo $response; } } ?> комментарии в коде мои до строк Код (PHP): // И запускаем /** @var Controllers_Home|Controllers_Test $controller */ $controller = new $class($this); // Передавая экземпляр текущего класс в него - $this $response = $controller->run(); echo $response; Третий и четвертый файл идентичны с очень маленькой разницей, вот третий файл Test.php Код (PHP): <?php class Controllers_Test { /** @var Core $core */ public $core; /** * Конструктор класса, требует передачи Core * * @param Core $core */ function __construct(Core $core) { $this->core = $core; } /** * Основной рабочий метод * * @return string */ public function run() { return "Мы выводим страницу <b>Test<b>"; } } ?> и четвертый файл Home.php Код (PHP): <?php class Controllers_Home { /** @var Core $core */ public $core; /** * Конструктор класса, требует передачи Core * * @param Core $core */ function __construct(Core $core) { $this->core = $core; } /** * Основной рабочий метод * * @return string */ public function run() { return "Мы выводим страницу <b>Home<b>"; } } ?> ну вот в принципе все файлы теперь кто мне может объяснить что имеет ввиду автор скрипта в втором скрипте Core.php, а именно в строках Код (PHP): // И запускаем /** @var Controllers_Home|Controllers_Test $controller */ $controller = new $class($this); // Передавая экземпляр текущего класс в него - $this $response = $controller->run(); echo $response; кто какие мысли выскажет? конкретно непонятна роль псевдо переменной $this Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
создается экземпляр класса Core и этот экземпляр передается в конструктор соответствующего контроллера. в сигнатуре конструктора контроллера видно что параметр типизирован: то есть после создания экземпляра контроллера, переданный экземпляр класса Core разместится в свойстве core экземпляра контроллера.
это указание что конкретная функция - конструктор класса - принимает в конкретном параметре - $core - только экземпляры класса Core или его производных. то есть попытка запихнуть туда допустим 1 приведет к ошибке несовпадения типа. Добавлено спустя 54 секунды: и постарайся не оверквоить раз и писать цитируемый текст выше своего ответа два. спасибо.
Я новый пользователь тут поэтому прошу меня понять и простить), а тут что у нас выведет в параметрах $controller = new $class($this); именно в $this что данная псевдо-переменная подставит в качестве параметра объекта? Это второй скрипт тоже Core.php Код (PHP): // И запускаем /** @var Controllers_Home|Controllers_Test $controller */ $controller = new $class($this); // Передавая экземпляр текущего класс в него - $this $response = $controller->run(); echo $response;
еще раз перечитай мое первое сообщение. на пальцах: в index.php есть строка $Core = new Core(); - это создание экземпляра класса Кор. внутри этого экземпляра он сам себя видит через переменную $this. итак, $this внутри экземпляра ссылается сам на себя - на этот экземпляр. то есть по сути на значение переменной $Core объявленной в index.php идем далее. строка $Core->handleRequest($req); - выполнение метода хэндлреквест экземпляра класса Кор, лежащего в переменной кор. внутри этого метода экземпляр так же доступен через переменную this. строки $class = 'Controllers_' . $name; и $class = 'Controllers_Home'; просто создают строки и помещают их в значение переменной класс. $controller = new $class($this); а вот тут магия. в переменную контролле кладется экземпляр класса, имя которого содержится в переменной $class а в конструктор этого класса передается значение переменной $this. а в значении переменной $this экземпляра класса Core лежит сам экземпляр класса Core напомню. в общем это ооп. если ты не особо готов к такому коду то тебе явно нужно подтягивать скил алгоритмизации программирования. и читать мануал.
Теперь я все четко понял, спасибо тебе за подробное разъяснение, и совет в каком русле двигаться, есть какие-нибудь ссылки на эту скилл алгоритмизацию программирования, с большим удовольствием почитал бы, а на счет мануала, там все сухо так порой мозг вскипает от то что они там городят, ну походу дела без мануала никак Добавлено спустя 3 минуты 39 секунд: Если в $this не указан конкретно взятый метод класса Core или член класса Core то тогда $this ссылается на объект класса Core? получается такая ссылка на саму себя, я правильно понимаю ?
Мануал не учит программировать, он описывает, что есть в языке и как этим пользоваться. Вот и все. Но ты молодец, что задумался о том, что сначала неплохо бы научиться именно алгоритмизации, а не "написанию цэмэсэ с нуля за три дня". Обычно народ, когда ему советуют именно программирование подучить, начинает в позу вставать. Ищи общую инфу. Ищи, что такое ООП. Шилдта почитай, оч годный дядька. ООП оно и в африке ООП, основные принципы схожи почти у всех языков в этом плане.
А зачем же мне в позу то становиться, я уважаю тех кто владеет знаниями и охотно с ними делится. А так спасибо за Шилдта и другие советы, ссылки что ты прикрепил тоже прочел возьму на заметку.
$this внутри методов класса (за исключением методов, объявленных с ключевым словом static, там другой разговор) всегда ссылается на текущий экземпляр класса. А что ты дальше делаешь - твоё дело. Ты можешь просто использовать эту ссылку, как здесь: Код (PHP): $controller = new $class($this); А можешь обратиться через неё к полям или методом класса: Код (PHP): $this->core = $core; $this->config['controllersPath'] Точно так же, как с обычной переменной, ссылающийся на класс: Код (PHP): $controller->run();
Подскажите а что за синтаксис тут использован в в виде ? : Код (PHP): $req = !empty($_REQUEST['q']) ? trim($_REQUEST['q']) : '';