$obj(4);
<?php class MagicTest{ //__tostring会在把<strong>对象</strong>转换为string的时候自动调用 public function __tostring(){ return "This is the Class MagicTest. "; } // __invoke会在把<strong>对象</strong>当作一个方法调用的时候自动调用 public function __invoke($x){ echo "__invoke called with parameter ".$x."\n"; } } $obj = new MagicTest(); echo $obj."\n"; $obj(5); ?>
출력:
이것은 매개변수 5로 호출되는 Class MagicTest
__invoke입니다.
__call()
객체 가 존재하지 않는 메소드 이름에 액세스하면 __call() 메소드가 자동으로 호출됩니다.
__callStatic()
객체 가 존재하지 않는 정적 메서드 이름을 지정하면 __callStatic() 메서드가 자동으로 호출됩니다. 이 두 메서드는 PHP에서 메서드 오버로딩이라고도 합니다.
덮어쓰기를 구분하는 데 주의하세요.
이 두 메서드를 통해 동일한 메소드 이름이 다른 메소드에 대응하여 구현될 수 있습니다.
<?php class MagicTest{ public function __tostring(){ return "This is the Class MagicTest. "; } public function __invoke($x){ echo "__invoke called with parameter ".$x."\n"; } //方法的重载 //这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组 public function __call($name,$arguments){ echo "Calling " . $name . " with parameters: ". implode(",", $arguments)."\n"; } //<strong>静态方法</strong>的重载,注意这个方法需要设定为static public static function __callStatic($name,$arguments){ echo "Static Calling " . $name . " with parameters: ". implode(",", $arguments)."\n"; } } $obj = new MagicTest(); //runTest这两个方法的名称本来不能完全相同,但是通过魔术方法,可以调用了 $obj->runTest("para1","para2"); //没有声明这个runTest方法,因为有__call这个魔术方法,也可以被调用 MagicTest::runTest("para1","para2"); //没有声明这个runTest方法,因为有__callStatic这个魔术方法,也可以被调用 ?>
매개변수로 runTest 호출: para1, para2
정적 매개변수로 runTest 호출: para1, para2
__get(), __set(), __isset(), __unset()
액세스할 수 없는 속성에 값을 할당할 때 __set()가 호출됩니다.
액세스할 수 없는 속성의 값을 읽으면 __get()이 호출됩니다.
액세스할 수 없는 속성에 대해 isset() 또는 empty()가 호출되면 __isset()가 호출됩니다.
액세스할 수 없는 속성이 호출될 때 unset( )가 호출되면 __unset()이 호출됩니다
소위 접근 불가능 속성은 실제로 특정 속성을 호출할 때 해당 속성이 정의되지 않은 것으로 발견됨을 의미합니다. 이때 다른 작업은 다른 매직 메서드를 트리거합니다. 🎜> 이러한 메서드는 속성 오버로딩의 매직 메서드라고도 합니다.
출력:
<?php class MagicTest{ public function __tostring(){ return "This is the Class MagicTest. "; } public function __invoke($x){ echo "__invoke called with parameter ".$x."\n"; } //方法的重载 //这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组 public function __call($name,$arguments){ echo "Calling " . $name . "with parameters: ". implode(",", $arguments)."\n"; } //<strong>静态方法</strong>的重载,注意这个方法需要设定为static public static function __callStatic($name,$arguments){ echo "Static Calling " . $name . "with parameters: ". implode(",", $arguments)."\n"; } //属性重载 public function __get($name){ return "Getting the property ".$name."\n"; } public function __set($name, $value){ echo "Setting the property ".$name." to value " . $value."\n"; } public function __isset($name){ echo "__isset invoked\n"; return true; } public function __unset($name){ echo "unsetting property ".$name."\n"; } } $obj = new MagicTest(); echo $obj->className."\n"; //className未定义,但是通过魔术方法__get,这个方法好像被定义了一样 $obj->className='MagicClassX'; //通过魔术方法__get将className名称定义为MagicClassX echo '$obj->name is set?'.isset($obj->className)."\n"; echo '$obj->name is empty?'.empty($obj->className)."\n"; unset($obj->className); ?>
__clone()
name='TBD'; //屏蔽你不想要他复制过去的数据,屏蔽掉他的数据,设置他的初始值
}
}
$james = new NbaPlayer();
$james->name = 'James';
echo $james->name."\n";
$james2 = clone $james;
echo "Before set up: James2's: ".$james2->name."\n";
$james2->name='James2';
echo "James's: ".$james->name;
echo "James's: ".$james2->name;
?>설정 전: James2의: TBD
James의: James
James의: James2 //James2의 데이터는 James의 데이터에 영향을 미치지 않습니다
-------------------------------- -- ------------------------------------------------PHP
객체
이것으로 프로그래밍 노트가 완성됩니다------------------------- -- ------------------------------------------------ --
위 내용은 PHP 객체지향 프로그래밍에 대한 소개 - 특별연습 DAY 4 관련 내용을 포함하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.