Program Tip

isset ()과 __isset ()의 차이점은 무엇입니까?

programtip 2021. 1. 8. 22:11
반응형

isset ()과 __isset ()의 차이점은 무엇입니까?


마법 기능 __isset()과 정상 기능 에 대해 알아야 합니다 isset(). 실제로 PHP 언어 구조 isset()와 PHP 매직 방법 의 실제 차이점은 무엇 __isset()입니까? 내가 구글을 검색했을 때 그들은 그것이 __isset()마법의 기능 이라고 말했습니다 . 일반적인 PHP 함수와 PHP의 매직 함수의 차이점은 무엇입니까?


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()
언어 구조 | 마법의 방법
                                      |
항상 bool 반환 | 결과는 사용자 정의 논리에 따라 다름 *
                                      |
코드에서 호출해야 함 | 이벤트에 의해 자동으로 호출
                                      |
무제한 매개 변수 | 매개 변수가 하나만 있습니다.
                                      |
모든 범위에서 사용 가능 | 방법으로 정의해야 함 **
                                      |
예약 된 키워드입니다 | 예약 된 키워드가 아닙니다.
                                      |
재정의 할 수 없음 (구문 분석 오류) | 확장 클래스에서 재정의 가능 ***

__isset()어쨌든 결과는 자동 으로 bool.

실제로 사용자 지정 함수를 정의 할 수 __isset()있지만 매직 메서드와는 관련이 없습니다.

이 예를 참조하십시오 .


마법 방법

일반적인 함수와는 달리 클래스 범위에서만 정의 할 수 있으며 액세스 할 수없는 메서드 호출, 클래스 직렬화, unset()액세스 할 수없는 속성에 사용되는 경우 등과 같은 특정 이벤트에서 자동으로 호출 될 수 있습니다. 공식 문서 : Overloading을 참조하십시오 .


__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은 마법의 방법이지만 당신은 그것을 호출하지 않을 것입니다. 줄이 에코 될 때 $ 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 매직 메서드를 간접적으로 호출합니다.


먼저 isset () 함수가 무엇을하는지 알려 드리겠습니다. isset () 함수는 값이 설정되었는지 또는 null인지 확인합니다. _ 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 ()이 class에서 보호 / 개인 변수에 대해 작동하도록 도와줍니다 .

예:

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()A는 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)되지만 나중에 'hidden'속성이 클래스 외부에서 보이지 않고 __isset()매직 함수를 호출 하지만 'data'에 설정되어 있지 않기 때문에 나중에 값 '2'를 에코 합니다. 를 반환합니다 bool(false). 에서 getHidden()가 내부 함수 객체에 볼 수있는 객체 개인 재산 '숨겨진'를 반환하지만 기능. 마지막 var_dump($obj->hidden)으로 __get()메서드를 호출 하고 NULL을 반환합니다. 에 있기 때문에 __get()방법을 보이는을 위해 data['hidden']하는 것입니다 NULL.

Note: the example here is from PHP Manuel: Overloading with some modifications.

Hope this helps!


isset() is for variables and __isset() is for properties of a class.

ReferenceURL : https://stackoverflow.com/questions/21227585/what-is-the-difference-between-isset-and-isset

반응형