|
|
|
| не совсем могу понять смысл конструктора, его роль, и когда его применять? | |
|
|
|
|
|
|
|
для: Bvz
(04.06.2011 в 12:32)
| | конструктор вызвается каждый раз когда вы создаёте класс.
к примеру
<?
class User
{
private $user;
function User($userid)
{
$this->user = //достаем юзера из базы у которого айди = $userid;
}
}
$user = new User(22);
|
в данном случае мы указываем конструктору какого юзера нужно загрузить при инициализации класса. | |
|
|
|
|
|
|
|
для: sl1p
(04.06.2011 в 12:50)
| | т.е. конструктор обязателен, а какие функции в нем должны быть? | |
|
|
|
|
|
|
|
для: Bvz
(04.06.2011 в 13:07)
| | Нет, для определения он не обязателен, но он обязательно вызывается при создании объекта. Если его не определяете, за вас его определит интерпретатор.
>а какие функции в нем должны быть?
Как правило, те, которые вы хотите вызывать до того, как с объектом начнет работать клиент (они могут и не потребоваться, если не нужны). | |
|
|
|
|
|
|
|
для: Bvz
(04.06.2011 в 12:32)
| | Это специальный метод класса, который вызывается автоматически (в отличие от других методов) при создании объекта (это позволяет инициализировать класс, приведя его переменные в непротиворечивое состояние). | |
|
|
|
|
|
|
|
для: 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, $errstr, 1);
if ( !$fp ) return false;
fwrite($fp, $this->_ip."\r\n");
$buff = '';
while ( !feof($fp) ) $buff .= fread($fp, 1024);
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 публичным и реализовать проверку правильности во всех методах класса. Но конструктор проверяет корректность один раз и все методы доверяют своим защищённым данным, поэтому делать проверки в каждом методе не нужно.
Если в классе нет ни одного поля, то конструктор, по сути, не нужен. Так же конструктор не нужен, если все поля инициализированы значениями по умолчанию и не зависят от внешних данных.
Как и любая другая функция, конструктор может иметь побочные эффекты. Например, изменять глобальные переменные, стартовать сессию, соединяться с базой данных и так далее. | |
|
|
|