#php #oop
#php #ооп
Вопрос:
Пожалуйста, кто-нибудь может посоветовать?
У нас есть абстрактный базовый класс с несколькими свойствами и некоторыми методами.
Методы (с параметрами) вызываются из унаследованных классов с общей целью присвоения переданным параметрам свойств базового класса, за исключением того, что они, по-видимому, не переопределяют значение по умолчанию.
Если я задаю значение (в целях тестирования) в конструкторе абстрактного (базового) класса, оно работает нормально, и все остальное, передаваемое конструктору, работает, но то, что мы хотим сделать, это заставить метод setErrors фактически установить значение свойства.
Пример:
//abstract base class
private $errors = array();//the property we want to overide
public function __construct()
{
$this->errors[] = "This is a required field";//for testing purposes only this works
}
public function setErrors($error)
{
var_dump($error);//this proves that $error is passing something...
$this->errors[] = $error;//this doesnt work(override the property)
var_dump($this->error);//the property now has the $error value...
}
public function getErrors()
{
return "<li>".implode("</li>n",$this->errors);
}
Я не уверен, связано ли это с тем, что базовый класс является абстрактным, т. Е. поскольку он не создается. Пожалуйста, кто-нибудь может объяснить, почему это не работает?
Заранее спасибо за проявленный интерес.
Редактировать МЫ НЕ ПЫТАЕМСЯ НАСЛЕДОВАТЬ ЧАСТНОЕ СВОЙСТВО ОТ БАЗОВОГО КЛАССА
Что мы хотим сделать, так это переопределить свойство с помощью метода set, а затем использовать общедоступный метод get для возврата свойства.
Комментарии:
1. В чем проблема? Это работает нормально .
Ответ №1:
Вы объявляете errors
поле как закрытое, поэтому доступ к нему имеет только класс, в котором оно объявлено (абстрактный суперкласс).
Вы можете либо сделать это, protected
чтобы подклассы могли получить к нему доступ, либо реализовать setErrors
метод в суперклассе.
Комментарии:
1. Опереди меня в этом: P (в любом случае, часть суперкласса)
2. Как указано ниже, мы не пытаемся получить доступ к частной собственности через унаследованные классы.
3. @Steve «переопределите свойство с помощью метода set, а затем используйте общедоступный метод get для возврата свойства». Это не имеет никакого смысла. Что такое переопределение свойства методом? Вы не можете коснуться свойства в подклассах, только если суперкласс предоставляет метод для управления им (или с помощью отражения)
4. Базовый класс имеет свойство ‘errors’ и пару методов для установки и получения свойства, однако метод set не «устанавливает» данные в свойство. Когда мы вызываем метод get, мы получаем значение null.
5. @Steve Тогда покажите нам реализацию этого метода get, который не работает.
Ответ №2:
Вы должны объявить $errors как защищенный, а не закрытый. Узнайте больше о видимости класса и объектов 😉
Обновить:
Хорошо, может быть, теперь я понимаю вашу проблему: P
Попробуйте изменить свои setErrors следующим образом:
public function setErrors($error)
{
var_dump($error);//this proves that $error is passing something...
$this->errors = (array) $error;//this works (override the property)
}
Комментарии:
1. Извините, Стив, но не ясно, чего вы ожидаете от своего кода. Не могли бы вы дополнить свой вопрос полным примером, ожидаемым результатом и фактическим?
2. Франческо, я обновил код. В основном у нас есть свойство ‘errors’ и методы set / get. Если вы игнорируете конструктор, мы пытаемся добавить значение к свойству с помощью метода set, но он этого не делает. Если вы установите значение свойства ‘error’ в конструкторе, как в коде, вы получите желаемые результаты, но, очевидно, мы не хотим этого делать, мы хотим, чтобы это делал метод setter.
3. [Ваш код работает][1] 🙂 Я только что добавил «s» в var_dump($this-> ошибка s ) [1]: codepad.org/GXQYkcUY
4. Спасибо, Франческо, должно быть, это вызвано чем-то другим, потому что это не работает, но фреймворк, который я создал, немного более обширный, чем код, о котором мы говорили. Вы помогли решить эту проблему, хотя технически вы ответили на вопрос, приветствую, особенно для тестирования. За это ты заслуживаешь пива 🙂
Ответ №3:
private
члены не видны в унаследованных классах. Для этого вы должны изменить видимость на protected
.
Комментарии:
1. Мы не пытаемся получить доступ к каким-либо членам базового класса через унаследованные классы. Мы вызываем метод базового класса из подкласса и передаем параметр. Затем мы устанавливаем свойство с переданным параметром и вызываем метод get, чтобы вернуть значение свойства, но по ходу вопроса… свойство не переопределяется.
2. Пожалуйста, добавьте несколько примеров кода и фактические, а также ожидаемые результаты. Для меня это не имеет смысла — но, возможно, я просто неправильно понимаю проблему.
3. Свойство должно быть установлено с помощью метода ‘setErrors()’ в том же классе, но его нет, весь код находится там. Затем мы использовали бы общедоступный метод get для возврата свойства, которое может быть вызвано из подкласса.
4. Извините, это не имеет смысла.
$this->errors[] = $error
даже не переопределяет свойство, оно скорее добавляет$error
к$this->errors
массиву.5. Спасибо, Стефан, знаешь ли ты правильный способ сделать это тогда, потому что в основном мы хотим, чтобы значение, переданное в $error, сохранялось в свойстве базового класса ‘error’?
Ответ №4:
Я нахожу кое-что, что может вам помочь. Я не претендую на ответ:-(
http://www.triconsole.com/php/oop.php
http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-4.php
Ответ №5:
в основном происходит то, что php добавит новую ошибку в существующий массив ошибок. например.
$this->error[0]="this fie..." //default value
$this->error[1]=`$error //the actual set error