Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: конструктор в ООП
 
 автор: Bvz   (04.06.2011 в 12:32)   письмо автору
 
 

не совсем могу понять смысл конструктора, его роль, и когда его применять?

  Ответить  
 
 автор: sl1p   (04.06.2011 в 12:50)   письмо автору
 
   для: Bvz   (04.06.2011 в 12:32)
 

конструктор вызвается каждый раз когда вы создаёте класс.

к примеру

<?
class User
{
        private 
$user;

    function 
User($userid)
    {
        
$this->user //достаем юзера из базы у которого айди = $userid;
    
}
}

$user = new User(22);


в данном случае мы указываем конструктору какого юзера нужно загрузить при инициализации класса.

  Ответить  
 
 автор: Bvz   (04.06.2011 в 13:07)   письмо автору
 
   для: sl1p   (04.06.2011 в 12:50)
 

т.е. конструктор обязателен, а какие функции в нем должны быть?

  Ответить  
 
 автор: cheops   (04.06.2011 в 14:05)   письмо автору
 
   для: Bvz   (04.06.2011 в 13:07)
 

Нет, для определения он не обязателен, но он обязательно вызывается при создании объекта. Если его не определяете, за вас его определит интерпретатор.

>а какие функции в нем должны быть?
Как правило, те, которые вы хотите вызывать до того, как с объектом начнет работать клиент (они могут и не потребоваться, если не нужны).

  Ответить  
 
 автор: cheops   (04.06.2011 в 14:02)   письмо автору
 
   для: Bvz   (04.06.2011 в 12:32)
 

Это специальный метод класса, который вызывается автоматически (в отличие от других методов) при создании объекта (это позволяет инициализировать класс, приведя его переменные в непротиворечивое состояние).

  Ответить  
 
 автор: Саня   (04.06.2011 в 14:14)   письмо автору
 
   для: Bvz   (04.06.2011 в 12:32)
 

Говоря формальным языком, конструктор предназначен для установки начального состояния объекта. Он автоматически вызывается при создании объекта.
Конструктор применяется, когда начальные значения полей объекта завясит от каких-либо внешних данных.

Например:
<?
class IP {
  protected 
$_ip;
  public function 
__construct($ip) {
    if ( !
preg_match('!^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$!'$ip) ) {
      throw new 
Exception('Некорректный IP-адрес: '.$ip);
    } else {
      
$this->_ip $ip;
    }
  }
  public function 
toInt() {
    return 
sprintf('%u'ip2long($this->_ip));
  }
  public function 
whois() {
    
$fp = @fsockopen('whois.ripe.net'43$errno$errstr1);
    if ( !
$fp ) return false;
    
fwrite($fp$this->_ip."\r\n");
    
$buff '';
    while ( !
feof($fp) ) $buff .= fread($fp1024);
    return 
$buff;
  }
  public function 
getCountry() {
    return 
file_get_contents('http://api.wipmania.com/'.$this->_ip);
  }
}

$ip = new IP('90.156.201.101');
print 
$ip->getCountry();

Этот класс предназначен для получения различной информации об IP адресе. Практическая ценность данного конкретного класса невелика. Это просто пример. Здесь поле $_ip инициализируется в конструкторе, в которые передаётся ip. В нём же проверяется правильность адреса. Объект не будет работать как надо с некорректным IP, поэтому конструирование прерывается с выбросом исключения. Если бы конструктор отсутствовал, то пришлось бы сделать $_ip публичным и реализовать проверку правильности во всех методах класса. Но конструктор проверяет корректность один раз и все методы доверяют своим защищённым данным, поэтому делать проверки в каждом методе не нужно.

Если в классе нет ни одного поля, то конструктор, по сути, не нужен. Так же конструктор не нужен, если все поля инициализированы значениями по умолчанию и не зависят от внешних данных.

Как и любая другая функция, конструктор может иметь побочные эффекты. Например, изменять глобальные переменные, стартовать сессию, соединяться с базой данных и так далее.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования