>  기사  >  백엔드 개발  >  __call, __set 및 __get 사용법

__call, __set 및 __get 사용법

巴扎黑
巴扎黑원래의
2016-11-29 11:28:281186검색

1. __call 사용법

PHP5 객체에는 객체의 다른 메소드를 모니터링하는 데 사용되는 새로운 특수 메소드 __call()이 있습니다. 객체에 존재하지 않는 메서드를 호출하려고 하면 __call 메서드가 자동으로 호출됩니다.

예: __call

<?php  
class foo {  
    function __call($name,$arguments) {  
        print("Did you call me? I&#39;m $name!<br>");  
        print_r($arguments);  
        print("<br><br>");  
    }  
  
    function doSecond($arguments)  
    {  
        print("Right, $arguments!<br>");  
    }  
}   
   
$test = new foo();  
$test->doFirst(&#39;no this function&#39;);  
$test->doSecond(&#39;this function exist&#39;);  
?>

2. __call은 "오버로드" 작업을 구현합니다.

이 특수 메서드는 "오버로드( 오버로딩)" 액션을 사용하므로 매개변수를 확인하고 개인 메소드를 호출하여 매개변수를 전달할 수 있습니다.

예: __call을 사용하여 "오버로드" 동작 구현

<?php  
class Magic {  
    function __call($name,$arguments) {  
        if($name==&#39;foo&#39;) {  
            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!");  
    }  
}   
  
$test = new Magic();  
$test->foo(3);  
$test->foo("3");  
?>

객체 지향 오버로딩

<?php  
/*__call(string $name,array $arg)的用法 
*当调用一个不可访问的方法的时候调用$name是方法名称 $arg是个数组包含要传递给方法的参数 
*/  
class Account{  
    private $user=1;  
    private $pwd=2;  
    public function __call($name,$arg){  
        switch(count($arg)){  
            case 2:  
                echo $arg[0]*$arg[1],PHP_EOL;  
                break;  
            case 3:  
                echo array_sum($arg),PHP_EOL;  
                break;  
            default:  
                echo "参数不对",PHP_EOL;  
                break;  
        }  
    }  
  
}  
    $a= new Account();  
    //这里模拟了重载  
    //重载:一个类中可以定义参数列表不同但名字相同的多个方法  
    $a->make(5);  
    $a->make(5,6);

4. __call() 메서드를 사용하여 일관된 데이터베이스 작업을 수행합니다

<?php  
  // 使用__call()方法来实现数据库连贯操作  
 // 申明一个Db类(数据库操作类)的简单操作模型  
  
class Db{  
    private $sql = array(  
        "field" => "",  
        "where" => "",  
        "order" => "",  
        "limit" => "",  
        "group" => "",  
        "having" => "",  
    );  
     
    // 连贯操作调用field() where() order() limit() group() having()方法,组合sql语句  
    function __call($methodName,$args){  
        // 将第一个参数(代表不存在方法的方法名称),全部转成小写方式,获取方法名称  
        $methodName = strtolower($methodName);  
         
        // 如果调用的方法名和成员属性数组$sql下标对应上,则将第二个参数给数组中下标对应的元素  
        if(array_key_exists($methodName,$this->sql)){  
            $this->sql[$methodName] = $args[0];  
        }else{  
            echo &#39;调用类&#39;.get_class($this).&#39;中的方法&#39;.$methodName.&#39;()不存在&#39;;  
        }  
        // 返回自己对象,则可以继续调用本对象中的方法,形成连贯操作  
        return $this;  
    }  
    // 输出连贯操作后组合的一个sql语句,是连贯操作最后的一个方法  
    function select(){  
        echo "SELECT {$this->sql[&#39;field&#39;]} FROM  user {$this->sql[&#39;where&#39;]} {$this->sql[&#39;order&#39;]} {$this->sql[&#39;limit&#39;]} {$this->sql[&#39;group&#39;]}  
                {$this->sql[&#39;having&#39;]}";  
    }  
}  
  
$db = new Db();  
  
// 连贯操作  
$db->field(&#39;sex, count(sex)&#39;)  
   ->where(&#39;where sex in ("男","女")&#39;)  
   ->group(&#39;group by sex&#39;)  
   ->having(&#39;having avg(age) > 25&#39;)  
   ->select();  
?>

5. __set 및 __get 사용법 🎜>

이것은 훌륭한 방법입니다. __set 및 __get 메서드를 사용하면 개체에 존재하지 않는 변수와 메서드를 캡처할 수 있습니다.

예: __set 및 __get

<?php  
class foo {  
    function __set($name,$val) {  
        print("Hello, you tried to put $val in $name<br>");  
    }  
   
    function __get($name) {  
        print("Hey you asked for $name<br>");  
    }  
}  
  
$test = new foo();  
$test->__set(&#39;name&#39;,&#39;justcoding&#39;);  
$test->__get(&#39;name&#39;);  
?>


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