Все ли переменные в методах должны быть свойствами объекта? (PHP) - PullRequest
1 голос
/ 25 ноября 2010

Я изучаю OO PHP и пытаюсь разобраться в практике кодирования. Вот урезанная версия кода, который я использую для обработки ошибок (и исключений):

final class MyErrorExceptionHandler {

    private $level = array(); // error levels to be handled as standard errors
    private $path = array(); // full path to file
    private $path_short; // filename plus working dir

    public function myErrorHandler($severity, $message, $file, $line) {
        if (error_reporting() & $severity) { // error code is included in error_reporting
            $this->level = array(E_WARNING => 'warning',
                E_NOTICE => 'notice',
                E_USER_WARNING => 'user warning',
                E_USER_NOTICE => 'user notice');
            if (array_key_exists($severity, $this->level)) { // handle as standard error
                /*$this->severity = $severity;
                $this->message = $message;
                $this->file = $file;
                $this->line = $line;*/
                $this->printMessage($severity, $message, $file, $line);
            } else { // fatal: E_USER_ERROR or E_RECOVERABLE_ERROR use php's ErrorException converter
                throw new ErrorException($message, 0, $severity, $file, $line);
            }
        }
    } // fn myErrorHandler

    private function printMessage($severity, $message, $file, $line) {
        echo ucfirst($this->level[$severity]) . ': ' . $message;
        $this->shortenPath($file);
        echo ' in ' . $this->path_short . ' on line ' . $line;
    } // fn printMessage

    private function shortenPath($file) {
        $this->path_short = $file;
        $this->path = explode(DIRECTORY_SEPARATOR, $file);
        if (count($this->path) > 2) { // shorten path to one dir, if more than one dir
            $this->path_short = array_pop($this->path); // filename
            $this->path_short = end($this->path) . DIRECTORY_SEPARATOR . $this->path_short; // dir+file
        }
    } // fn shortenPath

} // cl MyErrorExceptionHandler

Название этого вопроса, вероятно, немного не так, потому что я не на 100% по терминологии. В основном я пытаюсь выяснить несколько вещей.

  1. Правильно ли явно объявить $level и $path как массивы?
  2. Должно ли $level быть объявлено как есть (и сделано $this->level)? Если да, назначил ли я его значение (E_WARNING и т. Д.) В разумном месте? Будет ли конструктор (здесь не показан) более разумным выбором?
  3. Обратите внимание на закомментированный блок в myErrorHandler(). Первоначально я объявил все эти свойства в начале класса, а затем вызвал $this->printMessage() без каких-либо параметров. Какой путь более правильный? Если я сохраню код как есть, хочу ли я использовать $this->severity = $severity и т. Д. Внутри printMessage()?
  4. Итак, было бы лучше:

замена

$this->shortenPath($file);
echo ' in ' . $this->path_short . ' on line ' . $line;

с

$path_short = $this->shortenPath($file);
echo ' in ' . $path_short . ' on line ' . $line;

в конечном итоге, и дать возвращаемое значение в shortenPath()?

Я понимаю, что это путаница нескольких разных вопросов, но я пытаюсь найти общий вопрос о правильном стиле объявления / использования переменных / свойств, особенно при работе с методами.

Подводя итог: Когда я должен использовать $this->foo = $foo?

1 Ответ

3 голосов
/ 25 ноября 2010

РЕДАКТИРОВАТЬ: извините, я предположил ниже, что вы будете создавать новый экземпляр «объекта» с каждой ошибкой, что, очевидно, вы не делаете.Только отредактировал мой ответ, чтобы отразить это.

"Когда мне следует использовать $ this-> foo = $ foo?"

Может быть несколько случаев, когда вы это сделаете, но обычно этоесли вы создаете $ foo внутри метода и хотите, чтобы к нему обращался весь объект.

Например, если вы хотите вызвать объект и использовать его в этом конкретном объекте (если это не такимеет смысл продлить).Вы могли бы сделать что-то вроде:

$foo = new DataModel();
$this->foo = $foo;

ИЛИ

$this->foo = new DataModel();

Этот объект может быть декоратором или чем-то еще, связанным с обработкой ошибок, и приведенный выше код обычно присутствует в вашем конструкторе.Затем вы можете в любое время получить доступ к методам этого объекта, используя:

$this->foo->objectMethod();

.. и выразить что-то, отмеченное в комментариях к этому ответу:

"вы назначите$ file для объекта, как это используется в нескольких методах? "

Я бы не назначил $ file для объекта, вот почему.Семантика слова «свойство» означает «принадлежит».В вашем случае ваш класс является обработчиком ошибок.$ file не принадлежит обработчику ошибок, он принадлежит экземпляру ошибки.Если бы вашим классом был MyErrorHandler_Error (созданный для каждого экземпляра инициируемой ошибки), то $ file будет свойством этого класса, вместе с $ line и $ level.

Чтобы ответить на то, что я могу издругие ваши вопросы:

  1. Это ни то, ни другое.Я бы посчитал это предпочтением.

  2. Да - любые переменные или значения, которые должны быть доступны для всего вашего объекта и необходимы для правильной работы объекта, вероятно, должны быть установлены внутри вашего конструктора, еслине в ваших объявлениях переменных (не уверен в терминологии) в верхней части класса.

  3. прочтите комментарии ниже.Поскольку этот конкретный класс имеет дело с несколькими экземплярами ошибок, присваивание свойств этих ошибок объекту не будет лучшей практикой, поскольку вы будете перезаписывать их с каждой новой ошибкой.Однако имеет смысл хранить все ваши ошибки и свойства ошибок в массиве, назначенном объекту, если вам требуется доступ к историческим данным.Например, на данный момент, если вы создаете новую ошибку - это все, что вы делаете.У вас нет возможности получить доступ к любым старым ошибкам, которые создал этот объект.

  4. см. Выше

Вам также следует учитывать конфликты при назначении свойств дляобъекты.Вы, вероятно, переназначите, потому что если так, то старая собственность исчезнет.Довольно просто, но все же нужно учесть.

...