① __get/__set: Take over the properties of the object
When accessing a non-existent object property:
index.php
Copy code The code is as follows:
define('BASEDIR',__DIR__); //Define root directory constants
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
//When accessing a non-existent object property in php
echo $obj->title;
will throw an error: Notice: Undefined property: CommonObject::$title in D:practisephpdesignpsr0index.php on line 9
After adding __set and __get methods in Common/Object.php
Object.php
Copy code The code is as follows:
namespace Common;
class Object{
Function __set($key,$value){
}
Function __get($key){
}
}
Execute index.php again and no more errors will be reported.
Modify Common/Object.php again
Copy code The code is as follows:
namespace Common;
class Object{
Protected $array = array();
Function __set($key,$value){
var_dump(__METHOD__);
$this->array[$key] = $value;
}
Function __get($key){
var_dump(__METHOD__);
return $this->array[$key];
}
}
index.php
Copy code The code is as follows:
define('BASEDIR',__DIR__); //Define root directory constants
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
$obj->title = 'hello';
echo $obj->title;
Execute index.php, page output:
Copy code The code is as follows:
string 'CommonObject::__set' (length=20)
string 'CommonObject::__get' (length=20)
hello
② __call/__callStatic: Control the invocation of PHP object methods (__callStatic is used to control static methods of classes)
When executing a non-existent php method
index.php:
Copy code The code is as follows:
define('BASEDIR',__DIR__); //Define root directory constants
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
//When executing a non-existent php method
$obj->test('hello',123);
Executing index.php will report a fatal error: Fatal error: Call to undefined method CommonObject::test() in D:practisephpdesignpsr0index.php on line 9
If you define a __call method in Common/Object, it will automatically call back when the method does not exist:
Copy code The code is as follows:
namespace Common;
class Object{
Function __call($func, $param){ //$func method name $param parameter
var_dump($func, $param);
return "magic functionn"; //Return a string as the return value
}
}
index.php
Copy code The code is as follows:
define('BASEDIR',__DIR__); //Define root directory constants
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
//When executing a non-existent php method
echo $obj->test('hello',123);
Page output:
Copy code The code is as follows:
string 'test' (length=4)
array
0 => string 'hello' (length=5)
1 => int 123
magic function
When calling a non-existent static method
Common/Object.php
Copy code The code is as follows:
namespace Common;
class Object{
static function __callStatic($name, $arguments) {
var_dump($name, $arguments);
return "magic functionn"; //Return a string as the return value
}
}
Note: The __callStatic method must also be declared as a static method
index.php
Copy code The code is as follows:
define('BASEDIR',__DIR__); //Define root directory constants
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
//Execute a non-existent static method
echo CommonObject::test("hello",1234);
Execute index.php, page output:
Copy code The code is as follows:
string 'test' (length=4)
array
0 => string 'hello' (length=5)
1 => int 1234
magic function
③ __toString: Convert a PHP object into a string
index.php
Copy code The code is as follows:
define('BASEDIR',__DIR__); //Define root directory constants
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
echo $obj;
An error will be reported at this time: Catchable fatal error: Object of class CommonObject could not be converted to string in D:practisephpdesignpsr0index.php on line 8
Add __toString method in Object.php
Copy code The code is as follows:
namespace Common;
class Object{
Function __toString() {
return __CLASS__;
}
}
④ __invoke: When a PHP object is executed as a function, this magic method will be called back
index.php
Copy code The code is as follows:
define('BASEDIR',__DIR__); //Define root directory constants
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\Common\Loader::autoload');
$obj = new CommonObject();
echo $obj("test");
Object.php
Copy code The code is as follows:
namespace Common;
class Object{
Function __invoke($param) {
var_dump($param);
return 'invoke';
}
}
Page output:
Copy code The code is as follows:
string 'test' (length=4)
invoke