개발 꿀팁/PHP

PHP의 __call()

Jammie 2022. 7. 7. 16:54
반응형

PHP5의 개체는 개체에서 다른 방법을 모니터링하는 데 사용되는 __call() 전용 방법을 추가합니다.개체에 없거나 권한 제어에 있는 메서드를 호출하려고 하면 _call 메서드가 자동으로 호출됩니다.

예7:_call

<?php
class foo {
  function __call($name,$arguments) {
    print("Did you call me? I'm $name!");
  }
} $x = new foo();
$x->doStuff();
$x->fancy_stuff();
?>

이 특별한 방법은 JAVA에서 "overloading" 동작을 수행하는데 사용할 수 있습니다. 따라서 파라미터를 확인하고 개인 메서드를 호출하여 파라미터를 전달할 수 있습니다.

예 8: _call을 사용하여 "과부하" 동작을 수행합니다

<?php
class Magic {
  function __call($name,$arguments) {
    if($name=='foo') {
  if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
  if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
    }
  }   private function foo_for_int($x) {
    print("oh an int!");
  }   private function foo_for_string($x) {
    print("oh a string!");
  }
} $x = new Magic();
$x->foo(3);
$x->foo("3");
?>

인용:
_call과 ____callStatic은 php 클래스의 기본 함수입니다.

__call( ) 은( 는) 객체의 컨텍스트에서 호출된 메서드에 접근할 수 없으면 트리거합니다

__callStatic( ) 은( 는) 정적 컨텍스트에서 호출된 메서드에 액세스할 수 없는 경우,그것은 트리거될 것이다.

예:

<?php
abstract class Obj
{
protected $property = array();
 
abstract protected function show();
 
public function __call($name,$value)
{
if(preg_match("/^set([a-z][a-z0-9]+)$/i",$name,$array))
{
$this->property[$array[1]] = $value[0];
return;
}
elseif(preg_match("/^get([a-z][a-z0-9]+)$/i",$name,$array))
{
return $this->property[$array[1]];
}
else
{
exit("<br>;Bad function name '$name' ");
}
 
}
}
 
class User extends Obj
{
public function show()
{
print ("Username: ".$this->property['Username']."<br>;");
//print ("Username: ".$this->getUsername()."<br>;");
print ("Sex: ".$this->property['Sex']."<br>;");
print ("Age: ".$this->property['Age']."<br>;");
}
}
 
class Car extends Obj
{
public function show()
{
print ("Model: ".$this->property['Model']."<br>;");
print ("Sum: ".$this->property['Number'] * $this ->property['Price']."<br>;");
}
}
 
$user = new User;
$user ->setUsername("Anny");
$user ->setSex("girl");
$user ->setAge(20);
$user ->show();
 
print("<br>;<br>;");
 
$car = new Car;
$car ->setModel("BW600");
$car ->setNumber(5);
$car ->setPrice(40000);
$car ->show();
?>

 

반응형