__ разрушьте видимость для PHP

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

19
задан tereško 1 July 2012 в 19:32
поделиться

2 ответа

Кроме того, к ответу Mark Biek:

__ разрушают (), функция должна быть объявлена общественностью. Иначе функция не будет выполняться на завершении работы сценария:

Warning: Call to protected MyChild1::__destruct() from context '' during shutdown ignored in Unknown on line 0
Warning: Call to private MyChild2::__destruct() from context '' during shutdown ignored in Unknown on line 0

Это не может быть вредно, а скорее грязно.

, Но самая важная вещь об этом: Если деструктор будет объявлен частный или защищенный, то время выполнения бросит фатальную ошибку в момент, сборщик "мусора" пытается освободить объекты:

<?php
class MyParent
{
    private function __destruct()
    {
        echo 'Parent::__destruct';
    }
}

class MyChild extends MyParent
{
    private function __destruct()
    {
        echo 'Child::__destruct';
        parent::__destruct();
    }
}

$myChild = new MyChild();
$myChild = null;
$myChild = new MyChild();

?>

выводы

Fatal error: Call to private MyChild::__destruct() from context '' in D:\www\scratchbook\destruct.php on line 20

(Благодаря Mark Biek для превосходного примера!)

24
ответ дан 30 November 2019 в 03:53
поделиться

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

Что-то вроде этого бросило бы ошибку:

<?php
class MyParent
{
    private function __destruct()
    {
        echo 'Parent::__destruct';
    }
}

class MyChild extends MyParent
{
    function __destruct()
    {
        echo 'Child::__destruct';
        parent::__destruct();
    }
}

$myChild = new MyChild();
?>
9
ответ дан 30 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: