Home  >  Article  >  Backend Development  >  PHP classes and objects--overloading

PHP classes and objects--overloading

伊谢尔伦
伊谢尔伦Original
2016-11-23 14:03:22914browse

The "overloading" provided by PHP refers to dynamically "creating" class attributes and methods. We do this through magic methods.

Overloaded methods will be called when calling class attributes or methods that are undefined or invisible in the current environment.

All overloaded methods must be declared public.

Note:

1) None of the parameters of these magic methods can be passed by reference.

2) "Overloading" in PHP is different from most other object-oriented languages. Traditional "overloading" is used to provide multiple class methods with the same name, but each method has different parameter types and numbers.

Property overloading

public void__set(string$name, mixed$value)
publicmixed__get(string$name)
publicbool__isset(string$name)
publicvoid__unset(string$name)

When assigning a value to an inaccessible property, __set() will be called.

When reading the value of an inaccessible attribute, __get() will be called.

When isset() or empty() is called on an inaccessible property, __isset() will be called.

When unset() is called on an inaccessible property, __unset() will be called.

The parameter $name refers to the name of the variable to be operated. The $value parameter of the __set() method specifies the value of the $name variable.

Property overloading can only be done in objects. In static methods, these magic methods will not be called. So none of these methods can be declared static. As of PHP 5.3.0, defining these magic methods as static will generate a warning.

Note:

Because of the way PHP handles assignment operations, the return value of __set() will be ignored. Similarly, in the following chain assignment, __get() will not be called:

$a = $obj->b = 8;

Note:

is used in other language constructs except isset() Overloaded properties cannot be used in , which means that when empty() is used on an overloaded property, the overloaded magic method will not be called.

To avoid this limitation, you must assign the overloaded attribute to a local variable and then use empty().

Example #1 Use __get(), __set(), __isset() and __unset() for attribute overloading

class PropertyTest{
    /*被重载的数据保存在此*/
    private $data = array();
    /*重载不能被用在已经定义的属性*/
    public $declared = 1;
    /*只有从类外部访问这个属性时,重载才会发生*/
    private $hidden = 2;
    public function __set($name,$value)
    {
        echo "Setting &#39;$name&#39; to &#39;$value&#39;<br>";
        $this->data[$name] = $value;
    }
    public function __get($name)
    {
        echo "Getting &#39;$name&#39;<br>";
        if(array_key_exists($name,$this->data)){
            return $this->data[$name];
        }
        $trace = debug_backtrace();
        trigger_error(&#39;未知属性 via __get():&#39;.$name.&#39; in &#39;.$trace[0][&#39;file&#39;].&#39; on line &#39;.$trace[0][&#39;line&#39;],
            E_USER_NOTICE);  
        return null;
    }
    /*PHP5.1.0之后的版本*/
    public function __isset($name){
        echo "Is &#39;$name&#39; set?<br>";
        return isset($this->data[$name]);
    }
    /*PHP5.1.0之后的版本*/
    public function __unset($name){
        echo "Unsetting &#39;$name&#39;<br>";
        unset($this->data[$name]);
    }
    /*非魔术方法*/
    public function getHidden(){
        return $this->hidden;
    }
}
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a.&#39;<br>&#39;;
var_dump(isset($obj->a));
unset($obj->a);
echo &#39;<br>&#39;;
echo $obj->declared.&#39;<br>&#39;;
echo "Let&#39;s experiment with the private property named &#39;hidden&#39;:<br>";
echo "Privates are visible inside the class,so __set() not used...<br>";
echo $obj->getHidden().&#39;<br>&#39;;
echo "Privates not visible outside of class,so __get() is used...<br>";
echo $obj->hidden;

Output result:

Setting 'a' to '1'

Getting 'a'

1

Is 'a' set?

bool(true)
Unsetting 'a'

1

Let's experiment with the private property named 'hidden':

Privates are visible inside the class, so __set() not used ...

2

Privates not visible outside of class, so __get() is used...

Getting 'hidden'

Method overloading

public mixed __call ( string$name , array$arguments )
public static mixed __callStatic ( string$name , array$arguments )

When calling an inaccessible method in an object, __call( ) will be called.

When calling an inaccessible method in static mode, __callStatic() will be called.

The $name parameter is the name of the method to be called. The $arguments parameter is an enumeration array containing the parameters to be passed to the method $name.

Example #2 Use __call() and __callStatic() to overload the method

class MethodTest
{
    public function __call($name,$arguments)
    {
        //注意:$name的值区分大小写
        echo "Calling object method &#39;$name&#39; ".implode(&#39;,&#39;,$argument).&#39;<br>&#39;;
    }
    //PHP5.3.0之后的版本
    public static function __callStatic($name,$arguments)
    {
        //注意:$name的值区分大小写
        echo "Calling static method &#39;$name&#39; ".implode(&#39;,&#39;,$argument).&#39;<br>&#39;;
    }
}
$obj = new MethodTest;
$obj -> runTest(&#39;in object context&#39;);
MethodTest::runTest(&#39;in static context&#39;);

Output result:

Calling object method 'runTest'

Calling object method 'runTest'


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn