За последние 24 часа нас посетили 201684 программиста и 2096 роботов. Сейчас ищут 1728 программистов ...

помогите с объявлением "магических" методов

Тема в разделе "PHP для новичков", создана пользователем Guliver, 19 сен 2014.

  1. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Привет всем! У меня возникла проблема с объявлением "магического" метода __construct() в классе. Реализую MVC паттерн для своего сайта. С объявлением других методов нет никаких проблем, а вот именно с "магическими" сразу возникает ошибка такого рода: (Warning: Missing argument 1 for mTranslate::__construct(), called in A:\home\test2.ru\www\index.php on line 1048 ). Смотрим что у нас в индексном файле на строке 1048
    Код (Text):
    1. $_o = new $_sModelName();
    .
    Вот впринципе полный код скрипта, который отвечает за загрузку скриптов моделей из папки _models:
    Код (Text):
    1. class Looking_Model extends Looking {
    2.     /**
    3.     * Loads a model script to be executed and to return an object variable.
    4.     *
    5.     * Note all variables use underscores so as not to pass them to the model class file. This is
    6.     * just a precautionary failsafe. We do an unset() on all variables we can before the
    7.     * require_once() call.
    8.     *
    9.     * @param string $_sModelName The model path, such as 'Test', or 'SampleSystem/Test'. This translates
    10.     * to app/_models/Test.php and app/_models/SampleSystem/Test.php, for example. Note that models do not have
    11.     * an 'm' prefix before the filename because we really only needed in tabbed text editors to delineate
    12.     * files which are controllers or views, which is why controllers have the "c" prefix, while views
    13.     * have the "v" prefix.
    14.     */
    15.     public function load($_sModelName) {
    16.         $_F = $this->core->base();
    17.         if (strpos(' ' . $_sModelName,'/')>0) {
    18.             $_sBaseName = basename($_sModelName);
    19.             $_sPath = dirname($_sModelName);
    20.             $_sPath = rtrim($_sPath, '/') . '/';
    21.             $_sModelPath = $_sPath . $_sBaseName . '.php';
    22.             $_sModelName = basename($_sModelName);
    23.         } else {
    24.             $_sModelPath = $_sModelName . '.php';
    25.         }
    26.         if (!file_exists($_F . '/app/_models')) {
    27.             trigger_error('Your folder layout is missing a app/_models folder',E_USER_ERROR);
    28.         }
    29.         $_sPath = $_F . '/app/_models/' . $_sModelPath;
    30.         if (!file_exists($_sPath)) {
    31.             trigger_error('Your folder layout is missing a "' . $_sPath . '" models file',E_USER_ERROR);
    32.         }
    33.         unset($_sBaseName);
    34.         unset($_sModelPath);
    35.         unset($_F);
    36.         require_once($_sPath);
    37.         $_o = new $_sModelName();// строка 1048, которая выдает ошибку.
    38.         $_o->core = $this->core;
    39.         $_o->request = $this->request;
    40.         $_o->model = $this;
    41.         $_o->view = $this->view;
    42.         $_o->data = $this->data;       
    43.         return $_o;
    44.     }  
    45.    
    46. }
    Вот как автор объясняет зачем перед всеми переменными он использует нижнее подчеркивание: "* Note all variables use underscores so as not to pass them to the model class file. This is just a precautionary failsafe."
    Я пробовал убирать все подчеркивания - ошибка не ушла.
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Внимание: Нет первого аргумента.
     
  3. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Это что значит? Что я не передал что-то или где-то ошибка?

    Вот код самого класса:
    Код (Text):
    1. class mTranslate extends Looking {
    2.  
    3. /**
    4. * A sample class method
    5. *
    6. * @param string $sParam1 Something to query the names table's first names by.
    7. * @return string The first matching name.
    8. */
    9.  
    10.    
    11.         private $phrases;
    12.      
    13.        
    14.         public function __construct($site_lang) {
    15.          
    16.             $this->phrases = array();
    17.             $PDO = $this->data->mysql();
    18.             $sSQL = "select * from translation where lang_id = :site_lang";
    19.             $st = $PDO->prepare($sSQL); // Подготавливает запрос к выполнению и возвращает ассоциированный с этим запросом объект
    20.             $st->bindParam(':site_lang', $site_lang, PDO::PARAM_STR);
    21.             $st->execute();
    22.             $rsRows = $st->fetchAll();
    23.             foreach($rsRows as $rwRow)
    24.             {
    25.                 $this->phrases[strtolower($rwRow->phrase)] = $rwRow->translation;
    26.             }
    27.            
    28.         }
    29.  
    30.         public function translate($phrase) {
    31.             $phrase = strtolower($phrase);
    32.                 if (isset($this->phrases[$phrase])) {
    33.                     return $this->phrases[$phrase];
    34.                 } else {
    35.                     return "###";
    36.                 }
    37.         }
    38.  
    39. } // end class
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    =) ну чувак
     
  5. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Хорошо. Тогда вопрос : почему в классах где я не использую конструктор и передаю аргументы, такой ошибки нет?
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я не знаю, что в других случаях. Тут вот ругается, что аргумента не передал. А он есть, и без дефолтного значения. Значит он требуется.
     
  7. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Разрабатывайте даже простые проекты в IDE-среде господа и будет вам счастье.
    Даже до запуска приложения покажет большинство ошибок.