>  기사  >  백엔드 개발  >  PHP 오버로드 __get __set isset unset __call __callStatic python 정적 메서드 가져오기 정적 가져오기 차이 gcc 정적 링크 정적 라이브러리

PHP 오버로드 __get __set isset unset __call __callStatic python 정적 메서드 가져오기 정적 가져오기 차이 gcc 정적 링크 정적 라이브러리

WBOY
WBOY원래의
2016-07-29 08:53:101178검색

PHP의 오버로딩은 기존의 객체 지향 재작성과 다릅니다. 예를 들어 java에서는

<code>class A{

  public void  methodName(参数<span>1</span>);
  public void  methodName(参数<span>1</span>,参数<span>2</span>);
  public void  methodName(参数<span>1</span>,参数<span>2</span>,参数<span>3</span>);
  <span>...</span>}</code>

PHP의 오버로딩은 존재하지 않는 속성을 호출하는 것입니다. "우아한" 오류 처리 메커니즘. 왜 이것이 PHP에서 오버로딩이라고 불리는지 이해가 되지 않습니다. 이는 전통적인 객체 지향 프로그래밍의 오버로딩과는 아무런 관련이 없습니다.
PHP 오버로드는 매직 메소드 __get() __set() isset() unset() __call() __callStatic()에 의존합니다. 존재하지 않는 속성이나 메소드에 액세스하면 시스템이 자동으로 이러한 매직 메소드를 호출합니다.

코드:

<code><span><span><?php</span>
header(<span>"content-type:text/html;charset=utf-8"</span>);

<span><span>class</span><span>Sample</span>{</span><span>public</span><span>$p1</span> = <span>1</span>;<span>//类中声明的属性p1</span><span>//保存被重载的数据</span><span>private</span><span>$data</span> = <span>array</span>(); 

 <span>/*
   在访问对象不存在的属性时__get被调用
   $name:变量名
  */</span><span><span>function</span><span>__get</span><span>(<span>$name</span>)</span>
  {</span><span>"<br>__get:: "</span>.<span>$name</span>;
    <span>if</span>(array_key_exists(<span>$name</span>, <span>$this</span>->data)){
        <span>return</span><span>$this</span>->data[<span>$name</span>];
    }

    <span>$trace</span> = debug_backtrace();
    trigger_error(
        <span>'访问类中不存在的属性'</span>.<span>$name</span>.
        <span>' 文件:'</span>.<span>$trace</span>[<span>0</span>][<span>'file'</span>].
        <span>' 所在行'</span>.<span>$trace</span>[<span>0</span>][<span>'line'</span>]
        ,E_USER_WARNING);
    <span>return</span><span>null</span>;

  }

  <span>/*
   对象不存在的属性赋值时__set被调用
   $name:变量名
   $value:变量值
  */</span><span><span>function</span><span>__set</span><span>(<span>$name</span>,<span>$value</span>)</span>{</span><span>echo</span><span>"<br> __set:: $name = $value "</span>;
     <span>$this</span>->data[<span>$name</span>] = <span>$value</span>;

  }

  <span>/*
   对象不存在的属性使用isset()或empty() 时__isset被调用
   $name:变量名
   $value:变量值
  */</span><span><span>function</span><span>__isset</span><span>(<span>$name</span>)</span>{</span><span>echo</span><span>"<br>isset::  $name "</span>;
    <span>return</span><span>isset</span>(<span>$this</span>->data[<span>$name</span>]);
  }


  <span>/*
   对象不存在的属性使用unset()时被调用
   $name:变量名
   $value:变量值
  */</span><span><span>function</span><span>__unset</span><span>(<span>$name</span>)</span>{</span><span>echo</span><span>"<br>__unset::  $name"</span>;
    <span>unset</span>(<span>$this</span>->data[<span>$name</span>]);
  }

  <span>/*
    类的对象的不存在的实例方法调用的时候,会自动调用本方法,该方法必须是public
   */</span><span>public</span><span><span>function</span><span>__call</span><span>(<span>$name</span> , <span>$arguments</span>)</span>{</span><span>if</span>(<span>$name</span>===<span>'f1'</span>){
        <span>echo</span><span>"<br>"</span>.<span>$name</span>.<span>"方法被调用,"</span>.<span>"参数:"</span>;
        var_dump(<span>$arguments</span>);
    }<span>else</span><span>if</span>(<span>$name</span>===<span>'f2'</span>){
        <span>echo</span><span>"<br>"</span>.<span>$name</span>.<span>"方法被调用,"</span>.<span>"参数:"</span>;
        var_dump(<span>$arguments</span>);
    }<span>else</span>{

        trigger_error(<span>"非法调用!"</span>,E_USER_WARNING);
    }

  }

  <span>/*
     类的对象的不存在的静态方法调用的时候,会自动调用本方法
     5.3.0 新增 __callStatic()魔术方法。可见性未设置为 public 或未声明为 static 的时候会产生一个警告 
   */</span><span>public</span><span>static</span><span><span>function</span><span>__callStatic</span><span>(<span>$name</span> , <span>$arguments</span>)</span>{</span><span>echo</span><span>"<br>"</span>.<span>$name</span>.<span>"静态方法被调用,"</span>.<span>"参数:"</span>;
        var_dump(<span>$arguments</span>);

  }

 }


<span>$s</span> = <span>new</span> Sample();

<span>echo</span><span>"<br>访问类中存在的实例属性:s->p1:: "</span>.<span>$s</span>->p1;


<span>//属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。</span><span>//Fatal error: Access to undeclared static property: Sample::$p3</span><span>//echo "<br>访问类中不存在的静态属性不会调用魔术方法__get:".Sample::$p3;//错误</span><span>//访问类中不存在的属性,类中的魔术方法__get会被调用</span><span>echo</span><span>$s</span>->p2;

<span>//给类中不存在的属性赋值,类中的魔术方法__set会被调用</span><span>$s</span>->p2 = <span>88</span>;

<span>echo</span><span>'<br>'</span>.<span>$s</span>->p2; <span>//输出 88</span><span>//类中的魔术方法__isset会被调用</span>
var_dump(<span>isset</span>(<span>$s</span>->p2));
<span>//类中的魔术方法__isset会被调用</span>
var_dump(<span>empty</span>(<span>$s</span>->p2));

<span>//类中的魔术方法__unset会被调用</span><span>unset</span>(<span>$s</span>->p2);


<span>echo</span><span>'<br>'</span>.<span>$s</span>->p2; <span>//p2被销毁,报错</span><span>$s</span>->f1();
<span>$s</span>->f1(<span>1</span>,<span>2</span>);
<span>$s</span>->f1(<span>1</span>,<span>2</span>,<span>"hello"</span>);

<span>$s</span>->f2(<span>true</span>,<span>"111"</span>);

<span>$s</span>->f3();

<span>//调用对象不存在的静态方法</span>
Sample::say(<span>'hello'</span>);
Sample::say(<span>'hello'</span>,<span>'php'</span>);

<span>?></span></span></code>

static的作用,static electricity,static c语言,static 函数,java static,python static method,import static import区别,gcc static 链接静态库

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

위 내용은 정적 콘텐츠를 포함하여 php __get __set isset unset __call __callStatic의 오버로딩을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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