>백엔드 개발 >PHP 튜토리얼 >PHP 클래스의 Magic Method에 대한 간략한 요약

PHP 클래스의 Magic Method에 대한 간략한 요약

高洛峰
高洛峰원래의
2017-01-06 10:17:051422검색

1. __construct() 및 __destruct()

는 인스턴스가 생성/파괴될 때 호출되며 둘 다 0개 이상의 매개변수를 전달할 수 있습니다.

class A
 {
  function A()
  {
   echo "build A";
  }
 
  function __destruct()
  {
   echo "destroy A";
  }
 }
 
 $obj = new A();
 //unset($obj);

참고: 소멸자 메서드는 특정 개체에 대한 다른 참조가 없거나 종료 시퀀스 중에 어떤 순서로든 호출됩니다. .

생성자 관련하여 PHP 5.3.3부터 특정 네임스페이스에 정의된 클래스에서 클래스 이름으로 명명된 메서드는 더 이상 생성자로 간주되지 않습니다. 네임스페이스가 없는 클래스에서는 이전과 마찬가지로 여전히 생성자입니다. 예:

namespace Foo;
class Bar {
  public function Bar() {
    // treated as constructor in PHP 5.3.0-5.3.2
    // treated as regular method as of PHP 5.3.3
  }
}

Foo 네임스페이스가 없으면 Bar()도 생성자로 사용됩니다. 또한, 다음과 같은 상황이 존재하는 경우:

function __construct()
  {
   echo "construct A";
  }
 
  function A()
  {
   echo "build A";
  }
 
  function __destruct()
  {
   echo "destroy A";
  }
 }

즉, __construct()와 클래스 이름과 동일한 이름의 함수가 모두 포함되어 있는 것입니다. , 그러면 _만 _construct()로 호출됩니다.

2. __call() 및 __callStatic()

존재하지 않는 메서드를 호출하려고 할 때 호출됩니다. 두 개의 매개변수 중 하나는 메소드 이름이고 다른 하나는 호출된 메소드의 매개변수 배열입니다.

class MethodTest
{
  public function __call($name, $arguments)
  {
    // Note: value of $name is case sensitive.
    echo "Calling object method '$name' "
       . implode(&#39; &#39;, $arguments). "<br>";
  }
 
  public static function __callStatic($name, $arguments)
  {
    // Note: value of $name is case sensitive.
    echo "Calling static method &#39;$name&#39; "
       . implode(&#39; &#39;, $arguments). "<br>";
  }
}
 
$obj = new MethodTest;
$obj->runTest(&#39;in&#39;,&#39;object&#39;,&#39;context&#39;);
MethodTest::runTest(&#39;in&#39;,&#39;static&#39;,&#39;context&#39;);

그 중 $arguments 가 배열로 전달됩니다. 실행 결과:

객체 컨텍스트에서 객체 메서드 'runTest' 호출
정적 컨텍스트에서 정적 메서드 'runTest' 호출

또한 protected 및 private 함수의 범위에 주의하세요.

class TestMagicCallMethod {
  public function foo()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
 
  public function __call($method, $args)
  {
    echo __METHOD__.PHP_EOL."<br>";
    if(method_exists($this, $method))
    {
      $this->$method();
    }
  }
   
  protected function bar()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
 
  private function baz()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
}
 
$test  =  new TestMagicCallMethod();
$test->foo();
/**
 * Outputs:
 * TestMagicCallMethod::foo
 */
 
$test->bar();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::bar
 */
 
$test->baz();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::baz
 */

3.__get() 및 __set()

은 존재하지 않는 개체의 속성을 읽으려고 할 때 호출됩니다.

참고: 이 함수를 사용하여 Java의 리플렉션과 유사한 다양한 작업을 구현할 수 있습니다.

class Test
{
  public function __get($key)
  {
   echo $key . " not exists";
  }
  public function __set($key,$value)
  {
   echo $key . " = ".$value;
  }
}
 
$t = new Test();
echo $t->name."<br>";
$t->name = "abc";

출력:
이름이 존재하지 않습니다
name = abc

4. 🎜>이 메소드는 Java의 toString() 메소드와 유사합니다. 객체를 직접 인쇄할 때 이 함수를 호출하면 문자열이 반환됩니다.

class Test
{
  private $name = "abc";
  private $age = 12;
 
  public function __toString()
  {
    return "name : $this->name, age : $this->age";
  }
}
 
$t = new Test();
echo $t;

출력:

이름: abc, 나이: 12

PHP 클래스의 추가 매직 메소드(Magic 방법) 관련 기사의 간략한 요약을 보시려면 PHP 중국어 홈페이지를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.