В чем разница между isset() и isset()?


мне нужно знать о магической функции __isset() и нормальная функция isset(). Собственно в чем реальная разница между PHP языковая конструкция isset() и php magic method __isset() ? Когда я гуглил это они сказали, что __isset() - Это волшебная функция. В чем разница между обычными функциями php и магическими функциями в php?

7 53
php

7 ответов:

isset()

это конструкция языка, которая проверяет инициализацию переменных или свойств класса:

$a = 10;

isset($a);     // true
isset($a, $b); // false

class Test
{
    public $prop = 10;
}

$obj = new Test;
isset($obj->prop); // true

__isset()

это магический метод, который вызывается, когда isset() или empty() проверьте несуществующее или недоступное свойство класса:

class Test
{
    public function __isset($name) {
        echo "Non-existent property '$name'";
    }
}

$obj = new Test;
isset($obj->prop); // prints "Non-existent property 'prop'" and return false

отличия:

           isset()                               __isset()
Language construct                    | Magic method
                                      |
Always return bool                    | Result depends on custom logic*
                                      |
Must be invoked in code               | Called automatically by event
                                      |
Unlimited number of parameters        | Has only one parameter
                                      |
Can be used in any scope              | Must be defined as method**
                                      |
Is a reserved keyword                 | Not a reserved keyword
                                      |
Can't be redefined (Parse error)      | Can be redefined in extended class***

__isset() результат в любом случае будет автоматически кастед как bool.

на самом деле вы можете определить пользовательскую функцию __isset() но это не имеет ничего общего с магическими методами.

посмотреть .


Магические Методы

в отличие от обычных функций может быть определен только в области класса и вызывается автоматически на определенных событиях, таких как: недоступный вызов метода, сериализация класса, когда unset() используется для недоступных свойств и так далее. См. Также эту официальную документацию:перегрузка.

_ _ isset-это магический метод. Магические методы-это методы, называемые внутренне.

рассмотрим следующий код

<?php
// Declare a simple class
class TestClass
{
    public $foo;

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

    public function __toString()
    {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
echo $class;
?>

здесь _toString-это магический метод, но вы не будете его вызывать. Когда выполняется строка echo $class;. PHP знает, что теперь я должен рассматривать объект $class как строку и рассматривать любой объект как строковый вызов_tostring метод, если он реализован в этом классе.

все магические методы называются так в косвенных путь.

еще один пример как следовать

<?php
class CallableClass
{
    public function __invoke($x)
    {
        var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>

аналогично, в приведенном выше коде, var_dump (is_callable ($obj)); вызывает __invoke magic метод косвенно.

прежде всего позвольте мне рассказать вам, что делает функция isset (). Функция isset () проверяет, установлено ли значение или оно равно null. The _функция isset () - это магический метод в PHP. Любая функция с " _ " в начале-это магический метод в PHP. Теперь __isset() вызывается путем вызова isset() или empty () для недоступных свойств, под которыми я подразумеваю те свойства, которые не были определены в классе и явно определяются во время выполнения. Вот такой кусочек код, который должен заставить вас понять это лучше:

<?php
class PropertyTest
{
    /**  Location for overloaded data.  */
    private $data = array();

    /**  Overloading not used on declared properties.  */
    public $declared = 1;

    /**  Overloading only used on this when accessed outside the class.  */
    private $hidden = 2;

    public function __set($name, $value)
    {
        echo "Setting '$name' to '$value'\n";
        $this->data[$name] = $value;
    }

    public function __get($name)
    {
        echo "Getting '$name'\n";
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**  As of PHP 5.1.0  */
    public function __isset($name)
    {
        echo "Is '$name' set?\n";
        return isset($this->data[$name]);
    }

    /**  As of PHP 5.1.0  */
    public function __unset($name)
    {
        echo "Unsetting '$name'\n";
        unset($this->data[$name]);
    }

    /**  Not a magic method, just here for example.  */
    public function getHidden()
    {
        return $this->hidden;
    }
}


echo "<pre>\n";

$obj = new PropertyTest;

$obj->a = 1;
echo $obj->a . "\n\n";

var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";

echo $obj->declared . "\n\n";

echo "Let's experiment with the private property named 'hidden':\n";
echo "Privates are visible inside the class, so __get() not used...\n";
echo $obj->getHidden() . "\n";
echo "Privates not visible outside of class, so __get() is used...\n";
echo $obj->hidden . "\n";
?>

простыми словами, __isset () помогает isset () работать над защищенными/частными vars в классе .

пример:

class test
{
    public $x = array();
}

в вышеуказанном классе вы можете сделать это isset($test->x['key']) как $x общественная

а вот

class test
{
    protected $x = array();

    function __isset($key)
    {
        return isset($this->x[$key]);
    }
}

$x защищен, и вы не можете получить к нему доступ, поэтому мы создали __isset() чтобы помочь нам использовать isset($x['key'])

можно и так сказать __isset() - это просто мост для isset()

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

в вашем случае: __isset () будет автоматически вызываться, когда у вас есть isset (), который пытается получить недоступное свойство.

пример:

root@folgore:/tmp/php# cat a.php 
<?php
class a {
    private $att1;
    public $att2;

    function __isset($field) {
        echo "__isset invoked for $field\n";
    }
}

$obj=new a();

// __isset will be triggered:
isset($obj->att1);

// __isset will not be triggered:
isset($obj->att2);

root@folgore:/tmp/php# php a.php 
__isset invoked for att1

в чем разница между обычными функциями php и магическими функциями в php?

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

определить, если переменная установлена и не является NULL

но _ _ isset () - это собственность перегрузки класса.

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

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

<?php
    class PropertyTest
        {
            /**  Location for overloaded data.  */
            private $data = array();

            /**  Overloading not used on declared properties.  */
            public $declared = 1;

            /**  Overloading only used on this when accessed outside the class.  */
            private $hidden = 2;

            public function __set($name, $value)
            {
                echo "Setting '$name' to '$value'\n";
                $this->data[$name] = $value;
            }

            public function __get($name)
            {
                echo "Getting '$name'\n";
                if (array_key_exists($name, $this->data)) {
                    return $this->data[$name];
                }

                $trace = debug_backtrace();
                trigger_error(
                    'Undefined property via __get(): ' . $name .
                    ' in ' . $trace[0]['file'] .
                    ' on line ' . $trace[0]['line'],
                    E_USER_NOTICE);
                return null;
            }

            /*  As of PHP 5.1.0  */
             public function __isset($name) 
             { 
                 echo "Is '$name' set?\n"; 
                 return isset($this->data[$name]); 
             } 

            /**  As of PHP 5.1.0 */  
            public function __unset($name)
            {
                echo "Unsetting '$name'\n";
                unset($this->data[$name]);
            }

            /**  Not a magic method, just here for example.  */
            public function getHidden()
            {
                return $this->hidden;
            }
        }


        echo "<pre>\n";

        $obj = new PropertyTest;

        //__set() is called when 'a' property is not visible outside of class
        $obj->a = 1;
        //__get() is called when 'a' property is not visible outside of class
        echo "a: ".$obj->a . "\n\n";
        //__isset() is called when 'a' property is not visible outside of class
        var_dump(isset($obj->a));
        unset($obj->a);
        //__isset() is called when 'a' property is not visible outside of class
        var_dump(isset($obj->a));
        echo "\n";
        //__isset() is not called as 'declared' property is visible outside of class
        var_dump(isset($obj->declared));
        //__get() is not called as 'declared' property is visible outside of class            
        echo "declared: ". $obj->declared . "\n\n";
        //__set() is not called as 'declared' property is visible outside of class
        $obj->declared = 3;
        //__get() is not called as 'declared' property is visible outside of class 
        echo "declared: ". $obj->declared . "\n\n";

        //__isset() is called as 'hidden' property is not visible outside of class 
        var_dump(isset($obj->hidden));

        echo "Let's experiment with the private property named 'hidden':\n";
        echo "Privates are visible inside the class, so __get() not used...\n";
        echo $obj->getHidden() . "\n";
        echo "Privates not visible outside of class, so __get() is used...\n";
        var_dump($obj->hidden);

 ?>

приведенный выше код выведет

    Setting 'a' to '1'
    Getting 'a'
    a: 1

    Is 'a' set?
    bool(true)
    Unsetting 'a'
    Is 'a' set?
    bool(false)

    bool(true)
    declared: 1

    declared: 3

    Is 'hidden' set?
    bool(false)
    Let's experiment with the private property named 'hidden':
    Privates are visible inside the class, so __get() not used...
    2
    Privates not visible outside of class, so __get() is used...
    Getting 'hidden'
    NULL

он говорит, что свойство 'hidden' не установлено и показывает bool(false) но эхо из значения ' 2 'позже, потому что "скрытое" свойство не видно за пределами класса, и он вызывает __isset() волшебная функция, но она также не установлена в "данных", поэтому она возвращает bool(false). В getHidden() функция, хотя она возвращает частное свойство объекта "скрытый", которое видно для внутренних функций объекта. В последнем var_dump($obj->hidden) он называет __get() метод и он возвращает NULL. Потому что в __get() метод он ищет data['hidden'] что это NULL.

Примечание: пример здесь от PHP Manuel: перегрузка С некоторыми изменениями.

надеюсь, что это помогает!

isset() для переменных и __isset() для свойств класса.