Вчера я уже спрашивал о функциях __construct, __destruct, __get и __set. По совету полазил на сайте пхп. су, перечитал книгу. Я правильно понял, что первая функция нужна, чтобы при создании экземпляра класса можно было передавать сразу объекту какое-то значение и/или автоматически выполнялись какие-то операции (например вывод какого-то текста) ? Get нужна, чтобы при обращении к какому-то атрибуту класса автоматически проводились какие-то действия. Set, чтобы при задании какому-то атрибуту значения, опять же происходили какие-то операции. Например вывод разного текста в зависимости от значения?
Сорри, если вопрос сформулирован некорректно. Просто обычно я достаточно легко учусь новому, но почему-то именно эти функции мозг с трудом понимает
Другие языки программирования и технологии
Снова вопрос по функуиям в php5
__construct конструктор класса (вернее объекта класса) , вызывается при создании объекта.
__destruct деструктор, вызывается при удалении объекта.
__get - получение значения закрытого свойства
__set - установка значения закрытого свойства
__destruct деструктор, вызывается при удалении объекта.
__get - получение значения закрытого свойства
__set - установка значения закрытого свойства
Юрий Павлович не совсем верно ответил :)
Функции начинающиеся с __, называются магическими функциями http://www.php.net/manual/en/language.oop5.magic.php
__construct и __destruct функции, вызываемые при создании экземпляра класса и уничтожении экземпляра класса.
К примеру, простейший интерфейс для БД:
class db {
private $link;
function __construct() {
//Подключение к БД
$this->link=mysql_connect();
mysql_select_db("dbname",$this->link);
}
function __destruct() {
mysql_close($this->link)
}
function query($query) {
mysql_query($query,$this->link);
}
}
Далее, имя такой класс, в любой момент можно создать экземпляр класса:
$db=new db();
И вызвать сразу query, не думая о подключении. __construct при создании экземпляра класса автоматически подключится.
(Экземпляр класса, создается одинажды, и функция __construct и __destruct, будет вызываться тоже только одинажды)
$db->query("SELECT * FROM `table`");
затем, чтоб закрыть соединение, можно просто убить созданный экземпляр
unset($db); // При этом, будет вызвана функция __destruct;
Примечание. По окончанию исполнения php скрипты, все объекты, также будут удалятся. И если у класса, есть функция __destruct, то по окончанию работы всего скрипта, функции __destruct будут вызваны. Т. е. если не делать unset($db); и забыть про него. То соединение все равно будет закрыто, после того, как скрипт отработает и сгенерирует страницу.
с __get и __set вызываются, при обращении к несуществующим свойствам класса.
Пример:
class config {
private $options = array();
public $p = "2";
function __set($name,$value) {
$this->options[$name] = $value;
}
function __get($name) {
return $this->options[$name];
}
}
$config = new config(); //Создал экземпляр класса.
echo $config->p; // Читаем свойство $p, которое доступно для чтения и равно 2. Т. е. результат будет "2"
echo $config->a; // Пытаемся прочитать свойство $a, но этого свойства нету у класса. Результат будет NULL, так как у нас есть функция __get, еслиб небыло, то была бы ошибка при исполнении скрипта.
$config->a=2; // Если не использовать __set в классе, то при попытке присвоить свойству значение, мы получим ошибку.
Так как в классе у нас есть function __set($name,$value) {}, то тут $name = "a" а $value = "2", т. е. мы в таком случае, вызаваем функцию с параметрами __set("a","2");
Но это не создает свойство у класса. Оно будет записано в массив $options
echo $config->a; // Мы получим результат "2", что же произошло?
Сделав $config->a=2; Мы добавили в массив $options["a"] = 2;
При обращении к несуществующем свойству. Мы вызываем функцию __get("a"); Которая в свою очередь, возвращает значение по ключу "a" из массива $options
свойства private и protected, не доступны из вне, и если вызов будет к private или protected свойству, то будут работать __get и __set
Функции начинающиеся с __, называются магическими функциями http://www.php.net/manual/en/language.oop5.magic.php
__construct и __destruct функции, вызываемые при создании экземпляра класса и уничтожении экземпляра класса.
К примеру, простейший интерфейс для БД:
class db {
private $link;
function __construct() {
//Подключение к БД
$this->link=mysql_connect();
mysql_select_db("dbname",$this->link);
}
function __destruct() {
mysql_close($this->link)
}
function query($query) {
mysql_query($query,$this->link);
}
}
Далее, имя такой класс, в любой момент можно создать экземпляр класса:
$db=new db();
И вызвать сразу query, не думая о подключении. __construct при создании экземпляра класса автоматически подключится.
(Экземпляр класса, создается одинажды, и функция __construct и __destruct, будет вызываться тоже только одинажды)
$db->query("SELECT * FROM `table`");
затем, чтоб закрыть соединение, можно просто убить созданный экземпляр
unset($db); // При этом, будет вызвана функция __destruct;
Примечание. По окончанию исполнения php скрипты, все объекты, также будут удалятся. И если у класса, есть функция __destruct, то по окончанию работы всего скрипта, функции __destruct будут вызваны. Т. е. если не делать unset($db); и забыть про него. То соединение все равно будет закрыто, после того, как скрипт отработает и сгенерирует страницу.
с __get и __set вызываются, при обращении к несуществующим свойствам класса.
Пример:
class config {
private $options = array();
public $p = "2";
function __set($name,$value) {
$this->options[$name] = $value;
}
function __get($name) {
return $this->options[$name];
}
}
$config = new config(); //Создал экземпляр класса.
echo $config->p; // Читаем свойство $p, которое доступно для чтения и равно 2. Т. е. результат будет "2"
echo $config->a; // Пытаемся прочитать свойство $a, но этого свойства нету у класса. Результат будет NULL, так как у нас есть функция __get, еслиб небыло, то была бы ошибка при исполнении скрипта.
$config->a=2; // Если не использовать __set в классе, то при попытке присвоить свойству значение, мы получим ошибку.
Так как в классе у нас есть function __set($name,$value) {}, то тут $name = "a" а $value = "2", т. е. мы в таком случае, вызаваем функцию с параметрами __set("a","2");
Но это не создает свойство у класса. Оно будет записано в массив $options
echo $config->a; // Мы получим результат "2", что же произошло?
Сделав $config->a=2; Мы добавили в массив $options["a"] = 2;
При обращении к несуществующем свойству. Мы вызываем функцию __get("a"); Которая в свою очередь, возвращает значение по ключу "a" из массива $options
свойства private и protected, не доступны из вне, и если вызов будет к private или protected свойству, то будут работать __get и __set
Похожие вопросы
- И снова вопрос про 3ds max.Почему не работает Boolean
- ..почему, многие программисты не любят PHP5?
- PHP5 в подлиннике (Котеров) стоит читать? В смысле нормальная книга или нет?
- Посоветуйте пожалуйста платный хостинг с поддержкой PHP5, MySQL, SSH.
- autoran.inf появляется снова и снова, чистка реестра вручную тоже не помогла, постоянно нахожу файл: microssoft.exe...
- И снова Си...помогите
- И Снова Паскаль
- Как дать понять систебе чтоб она снова запускала виндоус с диска Ц
- Вопрос ПРОФЕССИОНАЛЬНЫМ или просто ОПЫТНЫМ программистам
- Снова С++. Эти строчки о чем?