Home  >  Article  >  Backend Development  >  PHP Object-Oriented Programming - Special Practice DAY 4

PHP Object-Oriented Programming - Special Practice DAY 4

WBOY
WBOYOriginal
2016-07-29 09:15:05857browse
Object-orientedSpecial practices
(only available in PHP, other languages ​​​​are not Object-oriented)
Object-oriented--magic methods __construct(), __destruct() constructors and destructors
__tostring()
__invoke()
__call(), __callStatic()
__get(), __set(), __isset(), __unset()
__clone()
__tostring()
When the
object is used as String, this method will be called automatically. Echo $obj;
__invoke()
When the
object is called as a method, this method will be automatically called
$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);

?>


output:

This is the Class MagicTest.
__invoke called with parameter 5

__call()

When the
object accesses a non-existing method name, the __call() method will be automatically called __callStatic()
When the
object accesses a non-existing static method name When Can be implemented in different ways

<?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这个魔术方法,也可以被调用

?>



Output:
Calling runTest with parameters: para1, para2
Static Calling runTest with parameters: para1, para2



__get(), __set(), __isset(), __unset( )
When assigning a value to an inaccessible property, __set() will be called

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

When calling isset() or empty() on an inaccessible property, __isset( ) will be called
When unset() is called on an inaccessible attribute, __unset() will be called
The so-called inaccessible attribute actually means that when calling a certain attribute, it is found that the attribute is not defined. At this time, different operations will Trigger different magic methods
These methods are also called magic methods of property overloading



<?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);
?>

Output:Getting the property className

Setting the property className to value MagicClassX
__isset invoked
$obj-> name is set?1 //If return is true, the result is displayed as 1; if return is false, the result is displayed as empty
__isset invoked
$obj->name is empty? //If return is true, the result is displayed Displayed as empty; if return is false, the result is displayed as 1
unsetting property className


oriented
object
--magic method

__clone()

PHP面向<strong>
                    The above is an introduction to PHP object-oriented programming - Special Practice DAY 4, including aspects of the content. I hope it will be helpful to friends who are interested in PHP tutorials. </strong>
                </p>
                    <p>

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