За последние 24 часа нас посетили 54337 программистов и 1767 роботов. Сейчас ищут 1475 программистов ...

Задачка для начинающих php программистов

Тема в разделе "PHP для новичков", создана пользователем ParenVkedah, 30 янв 2016.

  1. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Уважаемые посетители форума, столкнулся с такой проблемой, пытаюсь разобраться в скрипте уперся в одну строку которая не дает мне понять, что и как дальше понимать. Перейду к изложению проблемки.
    Есть сайт сосотоящий из 4 скриптов первый скрипт index.php находится в корне сайта выполняет роль роутера на сайте вот его код
    Код (PHP):
    1. <?php
    2. ini_set('display_errors', 1);
    3. ini_set('error_reporting', -1);
    4. if (!class_exists('Core')) {
    5.     require_once 'core/Core.php';
    6. }
    7. $Core = new Core();
    8. $req = !empty($_REQUEST['q'])
    9.     ? trim($_REQUEST['q'])
    10.     : '';
    11. $Core->handleRequest($req);
    12. ?>
    второй скрипт это скрипт ядра сайта Core.php привожу его код
    Код (PHP):
    1. <?php
    2. class Core {
    3.     public $config = array();
    4.     /**
    5.      * Конструктор класса
    6.      *
    7.      * @param array $config
    8.      */
    9.     function __construct(array $config = array()) {
    10.         $this->config = array_merge(
    11.             array(
    12.                 'controllersPath' => dirname(__FILE__) . '/controllers/',
    13.             ),
    14.             $config
    15.         );
    16.     }
    17.     
    18.     /**
    19.       конструктор при объявлении объекта класса core  принимает параметры которые он принимает в виде массива и передает эти параметры в публичный член 
    20.       в виде массива $config слитого с массивом array которому назначены данные в виде ключа controllersPath=> dirname(_FILE_) . '/controllers/',
    21.       то есть в публичном члене public $config=" хранится controllersPath=> dirname(_FILE_) . '/controllers/', и те параметры которые передаются 
    22. при объявление нового объекта класса Core      "
    23.     
    24.     
    25.     **/
    26.     
    27.     
    28.     
    29.     
    30.     
    31.     /**
    32.      * Обработка входящего запроса
    33.      *
    34.      * @param $uri
    35.      */
    36.      
    37.      /**
    38.          в обязательном параметре $uri к нам поступает адресная строка mysite.ru/test
    39.         **/ 
    40.     public function handleRequest($uri) {
    41.         /**
    42.          далее в переменную $request мы посредством функции exlode разбираем $uri  разделителем тут является '/' который указан первым параметром
    43.          explode
    44.         **/
    45.         $request = explode('/', $uri);
    46.         
    47.         /**
    48.          в переменную $name присваивается нулевое значение массива $request разбитого функцией explode и тут же функцией ucfirst первая
    49.          буква становится заглавной 
    50.         **/
    51.         
    52.         $name = ucfirst($request[0]);
    53.         /**
    54.         далее в переменную $file мы посредством $this обращаемся к значению массива $config ['controllersPath'] в котором прописан путь к директории 
    55. где у нас находятся контроллеры,  затем присоединяем к этому пути значение переменной $name в которой у нас содержится значение нулевого ключа Request
    56.  и присоединяем к этому всему раширение php 
    57.         **/
    58.         $file = $this->config['controllersPath'] . $name . '.php';
    59.         /**
    60.          если значению в $file нет   идентичного по названию которому нет в директории /controllers/ то тогда
    61. функция переводит нас на класс  ['controllersPath'] . 'Home.php'; то есть _dir name_/controllers/Home.php
    62.    и тогда переменной class мы определяем значение  Controllers_Home, а иначе переменной $class присваивается значение =Controllers_+$name 
    63. то есть если значение у $name=Test то значением $class='Controllers_Test'   
    64.         **/
    65.         // Если нужного контроллера нет, то используем контроллер Home
    66.         if (!file_exists($file)) {
    67.             $file = $this->config['controllersPath'] . 'Home.php';
    68.             // Определяем имя класса, согласно принятым у нас правилам
    69.             $class = 'Controllers_Home';
    70.         }
    71.         else {
    72.             $class = 'Controllers_' . $name;
    73.         }
    74.         /**
    75.          если такой класс не определен то загружааем его
    76.         **/
    77.         // Если контроллер еще не был загружен - загружаем его
    78.         if (!class_exists($class)) {
    79.             require_once $file;
    80.         }
    81.         // И запускаем
    82.         /** @var Controllers_Home|Controllers_Test $controller */
    83.         $controller = new $class($this); // Передавая экземпляр текущего класс в него - $this
    84.         $response = $controller->run();
    85.  
    86.         echo $response;
    87.     }
    88. }
    89.     
    90.     
    91.     ?>
    комментарии в коде мои до строк
    Код (PHP):
    1. // И запускаем
    2.         /** @var Controllers_Home|Controllers_Test $controller */
    3.         $controller = new $class($this); // Передавая экземпляр текущего класс в него - $this
    4.         $response = $controller->run();
    5.  
    6.         echo $response; 
    Третий и четвертый файл идентичны с очень маленькой разницей, вот третий файл Test.php

    Код (PHP):
    1. <?php
    2.  
    3. class Controllers_Test {
    4.     /** @var Core $core */
    5.     public $core;
    6.  
    7.  
    8.     /**
    9.      * Конструктор класса, требует передачи Core
    10.      *
    11.      * @param Core $core
    12.      */
    13.     function __construct(Core $core) {
    14.         $this->core = $core;
    15.     }
    16.  
    17.  
    18.     /**
    19.      * Основной рабочий метод
    20.      *
    21.      * @return string
    22.      */
    23.     public function run() {
    24.         return "Мы выводим страницу <b>Test<b>";
    25.     }
    26.  
    27. }
    28. ?>
    и четвертый файл Home.php
    Код (PHP):
    1. <?php
    2.  
    3. class Controllers_Home {
    4.     /** @var Core $core */
    5.     public $core;
    6.  
    7.  
    8.     /**
    9.      * Конструктор класса, требует передачи Core
    10.      *
    11.      * @param Core $core
    12.      */
    13.     function __construct(Core $core) {
    14.         $this->core = $core;
    15.     }
    16.  
    17.  
    18.     /**
    19.      * Основной рабочий метод
    20.      *
    21.      * @return string
    22.      */
    23.     public function run() {
    24.         return "Мы выводим страницу <b>Home<b>";
    25.     }
    26.  
    27. }
    28. ?>
    ну вот в принципе все файлы теперь кто мне может объяснить что имеет ввиду автор скрипта в втором скрипте Core.php, а именно в строках
    Код (PHP):
    1. // И запускаем
    2.         /** @var Controllers_Home|Controllers_Test $controller */
    3.         $controller = new $class($this); // Передавая экземпляр текущего класс в него - $this
    4.         $response = $controller->run();
    5.  
    6.         echo $response; 
    кто какие мысли выскажет? конкретно непонятна роль псевдо переменной $this

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    создается экземпляр класса Core и этот экземпляр передается в конструктор соответствующего контроллера.

    в сигнатуре конструктора контроллера видно что параметр типизирован:
    то есть после создания экземпляра контроллера, переданный экземпляр класса Core разместится в свойстве core экземпляра контроллера.
     
  3. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Не совсем понимаю слово Core вписанное в параметр конструктора это какой то оператор php ?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это указание что конкретная функция - конструктор класса - принимает в конкретном параметре - $core - только экземпляры класса Core или его производных. то есть попытка запихнуть туда допустим 1 приведет к ошибке несовпадения типа.

    Добавлено спустя 54 секунды:
    и постарайся не оверквоить раз и писать цитируемый текст выше своего ответа два. спасибо.
     
  5. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Я новый пользователь тут поэтому прошу меня понять и простить), а тут что у нас выведет в параметрах $controller = new $class($this); именно в $this что данная псевдо-переменная подставит в качестве параметра объекта? Это второй скрипт тоже Core.php
    Код (PHP):
    1. // И запускаем
    2.         /** @var Controllers_Home|Controllers_Test $controller */
    3.         $controller = new $class($this); // Передавая экземпляр текущего класс в него - $this
    4.         $response = $controller->run();
    5.  
    6.         echo $response; 
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    еще раз перечитай мое первое сообщение.
    на пальцах:
    в 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 напомню.

    в общем это ооп. если ты не особо готов к такому коду то тебе явно нужно подтягивать скил алгоритмизации программирования. и читать мануал.
     
  7. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Теперь я все четко понял, спасибо тебе за подробное разъяснение, и совет в каком русле двигаться, есть какие-нибудь ссылки на эту скилл алгоритмизацию программирования, с большим удовольствием почитал бы, а на счет мануала, там все сухо так порой мозг вскипает от то что они там городят, ну походу дела без мануала никак

    Добавлено спустя 3 минуты 39 секунд:
    Если в $this не указан конкретно взятый метод класса Core или член класса Core то тогда $this ссылается на объект класса Core? получается такая ссылка на саму себя, я правильно понимаю ?
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Мануал не учит программировать, он описывает, что есть в языке и как этим пользоваться. Вот и все. Но ты молодец, что задумался о том, что сначала неплохо бы научиться именно алгоритмизации, а не "написанию цэмэсэ с нуля за три дня". Обычно народ, когда ему советуют именно программирование подучить, начинает в позу вставать.

    Ищи общую инфу. Ищи, что такое ООП. Шилдта почитай, оч годный дядька.
    ООП оно и в африке ООП, основные принципы схожи почти у всех языков в этом плане.
     
  9. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    А зачем же мне в позу то становиться, я уважаю тех кто владеет знаниями и охотно с ними делится. А так спасибо за Шилдта и другие советы, ссылки что ты прикрепил тоже прочел возьму на заметку.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    $this внутри методов класса (за исключением методов, объявленных с ключевым словом static, там другой разговор) всегда ссылается на текущий экземпляр класса. А что ты дальше делаешь - твоё дело. Ты можешь просто использовать эту ссылку, как здесь:
    Код (PHP):
    1. $controller = new $class($this);
    2.  
    А можешь обратиться через неё к полям или методом класса:
    Код (PHP):
    1. $this->core = $core;
    2. $this->config['controllersPath']
    3.  
    Точно так же, как с обычной переменной, ссылающийся на класс:
    Код (PHP):
    1. $controller->run();
    2.  
     
  11. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Подскажите а что за синтаксис тут использован в в виде ? :
    Код (PHP):
    1. $req = !empty($_REQUEST['q'])
    2.     ? trim($_REQUEST['q'])
    3.     : '';
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
  13. maxmuha

    maxmuha Новичок

    С нами с:
    11 янв 2015
    Сообщения:
    107
    Симпатии:
    0
    Адрес:
    Мурманск
    вот хорошая книжка по PHP ООП

    просто, доступно, понятно.
     
  14. ParenVkedah

    ParenVkedah Новичок

    С нами с:
    30 янв 2016
    Сообщения:
    34
    Симпатии:
    0
    Cпасибо большое