2010-06-13 5 views
47

Я работаю с классами и структурой класса объектов, но не на сложном уровне - просто классы и функции, а затем в одном месте - создание экземпляра.Назначение PHP-конструкторов

Как __construct и __destruct скажите, пожалуйста, очень просто: , что является целью конструкторов и деструкторов?

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

Приведите также пример, пожалуйста.

С уважением

+0

Пример eac действительно хорош, теперь я немного понимаю, почему люди ищут конструктор и дескриптор, но скажите мне, если я не использую конструктор, я ничего не теряю ... bcoz в программе мы используем много функций, varaibles и т. д. для функций и variabl, как я могу использовать construc, есть ли там динамическое назначение, означает, что мы должны вызывать все имя функции внутри конструктора, – Bharanikumar

+1

Какова возможная причина не принимать ... ответ .... я нашел там ответ, отвечающий на вопрос –

ответ

7

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

Смотрите PHP Manual on Constructors and Destructors:

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

и

РНР 5 вводит концепцию деструкторов, аналогичную других объектно-ориентированных языков, таких как C++. Метод деструктора будет вызываться, как только будут удалены все ссылки на конкретный объект или когда объект будет явно уничтожен или в любом порядке в последовательности выключения.

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

class Example 
{ 
    private $database; 
    private $storage; 

    public function __construct($database) 
    { 
     $this->database = $database; 
     $this->storage = new SplObjectStorage; 
    } 
} 

Обратите внимание, что для того, чтобы сохранить свои объекты проверяемых, a constructor should not do any real work:

Работа в конструкторе, такие как: создание/инициализации коллаборационистов, общаясь с другими службами, и логика создать свое собственное государство удаляет швы, необходимые для тестирования, заставляя подклассы/матки унаследовать нежелательное поведение. Слишком много работы в конструкторе предотвращает создание экземпляров или изменение соавторов в тесте.

В приведенном выше Example$database является сотрудником. У этого есть жизненный цикл и цель его собственного и может быть общим экземпляром. Вы бы не создали это внутри конструктора. С другой стороны, SplObjectStorage является неотъемлемой частью Example. Он имеет тот же жизненный цикл и не используется совместно с другими объектами. Таким образом, это нормально для new это в ctor.

Аналогичным образом вы используете деструктор для очистки после вашего объекта. В большинстве случаев это не требуется, поскольку PHP обрабатывается автоматически. Вот почему вы увидите гораздо больше, чем dtors в дикой природе.

+0

ОК, извините, предположим, например, Основная цель кеша - повысить производительность сайта, даже я могу контролировать эту концепцию кэша, также мы можем показывать в реальном времени, например, в то время как exacuting query на тот момент в одном файле мы копируем записи и в следующий раз, когда пользователь пытается попасть в записи, тогда система будет выглядеть только файлом, а не живой БД, там, например, вы можете привести пример, пожалуйста, – Bharanikumar

+0

@Bharanikumar, это совершенно другой вопрос, чем то, о чем вы спрашиваете выше. Если вам нужен кеш, загляните в APC или memcache и изучите примеры кода, например Zend_Cache. – Gordon

+0

на самом деле я знаю кеш .no нет ... понять легко может кто-то сказать пример, как кеш, этот waht я спросил, но теперь у меня есть много примеров, – Bharanikumar

48

Конструктор - это функция, выполняемая после инициализации объекта (выделенная память, свойства экземпляра и т. Д.). Его цель - поставить объект в допустимое состояние.

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

Рассмотрим простой класс, который инкапсулирует строку и имеет метод, который возвращает длину этой строки. Одна из возможных реализаций будет:

class StringWrapper { 
    private $str; 

    public function setInnerString($str) { 
     $this->str = (string) $str; 
    } 

    public function getLength() { 
     if ($this->str === null) 
      throw new RuntimeException("Invalid state."); 
     return strlen($this->str); 
    } 
} 

Для того, чтобы быть в допустимом состоянии, эта функция требует setInnerString быть вызвана перед getLength. С помощью конструктора, вы можете заставить все экземпляры, чтобы быть в хорошем состоянии, когда getLength называется:

class StringWrapper { 
    private $str; 

    public function __construct($str) { 
     $this->str = (string) $str; 
    } 

    public function getLength() { 
     return strlen($this->str); 
    } 
} 

Вы также можете сохранить setInnerString, чтобы строка должна быть изменена после создания экземпляра.

Деструктор вызывается, когда объект собирается освободиться из памяти. Как правило, он содержит код очистки (например, закрытие дескрипторов файлов, которые объект держит). Они редки в PHP, потому что PHP очищает все ресурсы, хранящиеся в скрипте, когда заканчивается выполнение скрипта.

+1

Другой способ сказать «положить объект в правильное состояние» сказать «обеспечить, чтобы инварианты объектов были истинными». Инварианты класса - это факты, которые всегда должны быть верны в отношении экземпляров: как всегда, внутреннее значение str всегда должно быть инициализировано. – Oddthinking

+0

Хороший пример ... –

41

Учитесь на примерах:

class Person { 
    public $name; 
    public $surname; 
    public function __construct($name,$surname){ 
    $this->name=$name; 
    $this->surname=$surname; 
    } 
} 

Почему это полезно? Потому что вместо того, чтобы:

$person = new Person(); 
$person->name='Christian'; 
$person->surname='Sciberras'; 

вы можете использовать:

$person = new Person('Christian','Sciberras'); 

Что меньше кода и выглядит чище!

Примечание: в соответствии с приведенными ниже правильными описаниями конструкторы/деструкторы используются для самых разных функций, включая: де инициализацию переменных (особенно когда переменная является переменной), деление памяти, инварианты (возможно, быть превзойденным) и более чистый код. Я также хотел бы отметить, что «чистый код» - это не просто «сахар», а улучшает читаемость, ремонтопригодность и т. Д.

+0

Помимо сомнительного использования публичных объектов, я думаю, что этот ответ не подходит. Конструкторы не являются просто синтаксическим сахаром, поскольку это, по-видимому, подразумевается, они являются способом обеспечения соблюдения инвариантов. – Artefacto

+5

Он не только выглядит чище. Это предотвращает ошибки: что произойдет, если вы забудете указать фамилию? Конструктор заставляет вас это делать. – johannes

+1

ОП просят пример в реальной жизни, и я показал его. Использование общедоступных свойств заключается в том, что этот пример является функциональным для обоих случаев. Мой ответ не пропустит ни одной точки. Конструктор может использоваться для чего угодно (включая то, что вы упомянули) для установки переменных по умолчанию. Краткое описание: класс A {protected $ path; public function __construct() {$ this-> path = getcwd(). 'path'; }} – Christian

7

Конструктор запускается во время создания экземпляра вашего класса. Так что если у вас есть класс Person:

class Person { 

    public $name = 'Bob'; // this is initialization 
    public $age; 

    public function __construct($name = '') { 
     if (!empty($name)) { 
      $this->name = $name; 
     } 
    } 

    public function introduce() { 
     echo "I'm {$this->name} and I'm {$this->age} years old\n"; 
    } 

    public function __destruct() { 
     echo "Bye for now\n"; 
    } 
} 

Чтобы продемонстрировать:

$person = new Person; 
$person->age = 20; 
$person->introduce(); 

// I'm Bob and I'm 20 years old 
// Bye for now 

Мы можем переопределить значение по умолчанию, установленное с инициализацией с помощью аргумента конструктора:

$person = new Person('Fred'); 
$person->age = 20; 
$person->introduce(); 

// if there are no other references to $person and 
// unset($person) is called, the script ends 
// or exit() is called __destruct() runs 
unset($person); 

// I'm Fred and I'm 20 years old 
// Bye for now 

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

  1. __construct() может включать классы по умолчанию с ресурсами или более сложные структуры данных.
  2. __destruct() может освобождать ресурсы, такие как файлы и дескрипторы баз данных.
  3. Конструктор часто используется для class composition или constructor injection of required dependencies.
0

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

Без нового объекта мы будем жить в стране null, и сбой!

Деструктор наиболее очевиден с точки зрения C++, где, если у вас нет метода деструктора, удалите всю указанную память, он останется включенным после выхода программы из-за утечек и задержки на ОС клиентов до следующей перезагрузки.

Я уверен, что здесь более чем достаточно хорошей информации, но другой угол всегда полезен из того, что я заметил!

+0

О части утечки, это не точно. Когда вы выходите из программы, любая утечка удаляется (если память не находится в другой программе). Утечки памяти плохо в основном во время использования программы, а не при ее выходе. Например, у меня когда-то была программа, которая пропустила 700Mb за 1 час использования. Но когда все закрылось, все стало нормально. – Christian