Какой "правильный способ" использовать деструкторы в PHP
При просмотре ссылок хороших занятий PHP
для управления памятью я наткнулся на несколько intendimentos, как использовать деструкторы.
я Знаю, что главный актер-это Garbage Collector плохие-это не часть области, что на мой вопрос.
Фильмография:
- родном Руководстве PHP
- среди некоторых общин моментом этого
- ссылается на внешний
, Плохие мои показания мне приносят вопросы которые не нашел ответов, сами будучи...
Вопросы:
- функции
__destruct(){}
пустой будет удалить любое значение, связанное с класса, или нужно явно указать эти значения в вашей области? -
После создания экземпляра класса за привлечение и до завершения работы сценария, в чем разница между использованием
NULL
иunset()
по пример:<?php $refer = new MyClass(); $refer->hello(); // output: Hello World! $refer = NULL; // ou unset($refer); // mais blocos de código aqui...
-
По Руководстве PHP наследования clase требует, чтобы класс "дочь" explicite называются
parent::__destruct()
в деструкторе... плохие и в случае, если классы не расширены, instanciam другого класса в своей области? При назначенииNULL
или использоватьunset()
до закрытия сценарий forcará обоих деструкторы или нужно пояснить? Пример:<?php /** class Core { public function __construct(){} public function session($start=true) { if ( !$start ) { if ( isset($_SESSION) ) { session_destroy(); return true; } } session_start(); } public function language() { if ( isset($_SESSION) ) { $_SESSION['language'] = 'pt-BR'; } } public function layoutEngine() { return new HandlerUI(); // outra classe } function __destruct(){ # } } class HandlerUI { function __construct() { return $this; } public function Header() { return "<head><title>Hello World</title></head>"; } public function NavBar() { return "<nav>This is navbar</nav>"; } public function Drawer() { return "<div class='drawer-container'></div>"; } public function Footer() { return "<footer>I am Footer</footer?"; } public function JavaScript() { return "<script type='text/javascript'>console.log('hola que tal');</script>"; } function __destruct(){ # } } */ // caso de uso: $app = new Core() $app->session(); $app->language(); $layout = $app->layoutEngine(); unset($app); // ou $app = NULL; ?> <!DOCTYPE html> <html lang="<?php echo $_SESSION['language'];?>"> <?php $layout->Header(); ?> <body id="body"> <!-- CONTAINER --> <section class="default"> <?php // navbar $layout->Navbar(); // drawer $layout->Drawer(); ?> <!-- CENTRAL BLOCK --> <section id="central-block"></section> <?php // $layout->Footer(); ?> </section> <?php // $layout->JavaScript(); unset($layout); // ou $layout = NULL; // mais blocos de código aqui... ?> </body> </html>
- и больше я подвергаю сомнению: при использовании OPcache или другого кэш код (что сохраняется в памяти компиляции), как рассматривается в fução
__destruct()
в этом случае, если использование кэш-памяти?
я Знаю, что не существует "правильный способ" увидеть, что это зависит от случая использования, потребностей код и подхода, а структура его плохие ищу понимание того, квалифицированный.
, Так как вы уже благодарен.
1 answers
Метод __destruct
служит для того, чтобы выполнить последнее действие, прежде чем объект больше не существует.
Пользой, что может быть сделано с ним, если вы строите framework, положить на Контроллер универсального применения каналы с тем же именем, Контроллер в конце запуска. Когда другие controllers extenderem контроллер универсальный все они будут иметь эту функциональность вызова каналы надлежащего автоматически в конце выполнения.
Пример кода с помощью __construct и __destruct :
<?php
class Teste
{
private $nome;
function __construct($nome)
{
echo 'O objeto foi construído.<br>';
$this->nome = $nome;
}
function saudacao()
{
return 'Olá ' . $this->nome . '! <br>';
}
function __destruct()
{
echo 'O objeto não existirá mais após essa mensagem.';
}
}
$teste = new Teste('Lauro');
echo $teste->saudacao();
?>
Output, созданный при запуске скрипта:
O objeto foi construído.
Olá Lauro!
O objeto não existirá mais após essa mensagem.
Примечание: PHP очищает все переменные из памяти в конце выполнения скрипта. Итак, в конце сценария, при удалении объекта он запускает destruct автоматически. Но если объект был уничтожен при отключенном в destruct было бы с таким же именем, только то, что до окончания выполнения скрипта в целом.
Нет необходимости объявить __construct или __destruct, если не использовать их.