千家信息网

php中魔术方法的使用示例

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"php中魔术方法的使用示例",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"php中魔术方法的使用示例"吧!复制代码 代码如下:/** PH
千家信息网最后更新 2026年11月02日php中魔术方法的使用示例

本篇内容主要讲解"php中魔术方法的使用示例",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"php中魔术方法的使用示例"吧!

复制代码 代码如下:


/** PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以你定义自己的类方法时,不要以 __为前缀。 * */

// __toString、__set、__get__isset()、__unset()
/*
The __toString method allows a class to decide how it will react when it is converted to a string.
__set() is run when writing data to inaccessible members.
__get() is utilized for reading data from inaccessible members.
__isset() is triggered by calling isset() or empty() on inaccessible members.
__unset() is invoked when unset() is used on inaccessible members.
*/
class TestClass {

private $data = array();
public $foo;

public function __construct($foo) {
$this->foo = $foo;
}

public function __toString() {
return $this->foo;
}

public function __set($name, $value) {
echo "__set, Setting '$name' to '$value'\n";
$this->data[$name] = $value;
}

public function __get($name) {
echo "__get, Getting '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
}

/** As of PHP 5.1.0 */
public function __isset($name) {
echo "__isset, Is '$name' set?\n";
return isset($this->data[$name]);
}

/** As of PHP 5.1.0 */
public function __unset($name) {
echo "__unset, Unsetting '$name'\n";
unset($this->data[$name]);
}

}

$obj = new TestClass('Hello');
echo "__toString, $obj\n";
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n\n";
/**
输出结果如下:
__toString, Hello
__set, Setting 'a' to '1'
__get, Getting 'a'
__isset, Is 'a' set?
bool(true)
__unset, Unsetting 'a'
__isset, Is 'a' set?
bool(false)
**/

// __call __callStatic
/*
mixed __call ( string $name , array $arguments )
mixed __callStatic ( string $name , array $arguments )
__call() is triggered when invoking inaccessible methods in an object context.
__callStatic() is triggered when invoking inaccessible methods in a static context.
The $name argument is the name of the method being called.
The $arguments argument is an enumerated array containing the parameters passed to the $name'ed method.
*/
class MethodTest {
public function __call($name, $arguments) {
// Note: value of $name is case sensitive.
echo "__call, Calling object method '$name' " . implode(', ', $arguments) . "\n";
}

/** As of PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
// Note: value of $name is case sensitive.
echo "__callStatic, Calling static method '$name' " . implode(', ', $arguments) . "\n";
}

}

$obj = new MethodTest;
$obj->runTest('in object context', 'param2', 'param3');
//MethodTest::runTest('in static context'); // As of PHP 5.3.0
echo "\n\n";
/**
输出结果如下:
__call, Calling object method 'runTest' in object context, param2, param3
string(10) "__invoke: "
*/

// __invoke
/*
The __invoke method is called when a script tries to call an object as a function.
Note: This feature is available since PHP 5.3.0.
*/
class CallableClass {
function __invoke($x) {
var_dump($x);
}
}

$obj = new CallableClass;
//$obj(5);
var_dump('__invoke: ' . is_callable($obj));
echo "\n\n";

// __sleep __wakeup
/*
串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输.
然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法.
有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.
当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法.
这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值.
如果没有__sleep方法,PHP将保存所有属性.下面的例子显示了如何用__sleep和__wakeup方法来串行化一个对象.
Id属性是一个不打算保留在对象中的临时属性. __sleep方法保证在串行化的对象中不包含id属性.
当反串行化一个User对象,__wakeup方法建立id属性的新值. 这个例子被设计成自我保持.
在实际开发中,你可能发现包含资源(如图像或数据流)的对象需要这些方法
*/

class User {

public $name;
public $id;

function __construct() {
//give user a unique ID 赋予一个差别 的ID
$this->id = uniqid();
}

//__sleep返回值的类型是数组,数组中的值是不需要串型化的字段id

function __sleep() {
//do not serialize this->id 不串行化id
return(array("name"));
}

function __wakeup() {
//give user a unique ID
$this->id = uniqid();
}

}

//create object 成立一个器材
$u = new User;
$u->name = "Leon"; //serialize it 串行化 留意不串行化id属性,id的值被遗弃
$s = serialize($u);
echo "__sleep, __wakeup, s: $s"; //unserialize it 反串行化 id被重新赋值
$u2 = unserialize($s); //$u and $u2 have different IDs $u和$u2有差别 的ID
print_r($u);
print_r($u2);
echo "\n\n";
/**
输出结果如下:
__sleep, __wakeup, s: O:4:"User":1:{s:4:"name";s:4:"Leon";}
User Object
(
[name] => Leon
[id] => 4db1b17640da1
)
User Object
(
[name] => Leon
[id] => 4db1b17640dbc
)
*/


// __set_state
/*
This static method is called for classes exported by var_export() since PHP 5.1.0.
The only parameter of this method is an array containing exported properties in the form array('property' => value, ...).
*/

class A {

public $var1;
public $var2;

public static function __set_state($an_array) { // As of PHP 5.1.0
//$an_array打印出来是数组,而不是调用时传递的对象
print_r($an_array);
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}

}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
echo "__set_state:\n";
eval('$b = ' . var_export($a, true) . ';');
// $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);
echo "\n\n";
/**
输出结果如下:
__set_state:
Array
(
[var1] => 5
[var2] => foo
)
object(A)#5 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
*/

// __clone
class SubObject {

static $instances = 0;
public $instance;

public function __construct() {
$this->instance = ++self::$instances;
}

public function __clone() {
$this->instance = ++self::$instances;
}

}

class MyCloneable {

public $object1;
public $object2;

function __clone() {
// Force a copy of this->object, otherwise
// it will point to same object.
$this->object1 = clone $this->object1;
}

}

$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("__clone, Original Object:\n");
print_r($obj);
print("__clone, Cloned Object:\n");
print_r($obj2);
echo "\n\n";
/**
输出结果如下:
__clone, Original Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
) [object2] => SubObject Object
(
[instance] => 2
))
__clone, Cloned Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
) [object2] => SubObject Object
(
[instance] => 2
))
*/

到此,相信大家对"php中魔术方法的使用示例"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

方法 对象 属性 结果 输出 魔术 数组 示例 数据 两个 代码 例子 内容 变量 实际 差别 学习 实用 更深 成功 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技与互联网 互联网科技垄断 合肥互联网科技公司 万达互联网科技 多迪互联网科技有限公司 互联网科技创新企业排名 常德市电业局互联网科技部 武汉健翔互联网络科技有限公司 语蝶互联网科技有限公司 玉溪互联网科技怎么选 速维有品互联网信息科技(苏州)有限公司 互联网科技大奖都有哪些公司 浙南科技城互联网大厦建设工程 华夏恒生互联网科技013171 怎样加入科技互联网 云南省自由互联网科技有限公司 浙南科技城互联网大厦招聘 有人说阿里系是互联网科技企业 互联网与数字科技关系 易租星互联网科技有限公司 小马过河互联网科技 远拓互联网科技 菲比寻常互联网科技 齐家互联网科技有限公司 互联网和高科技公司 和信科技工业互联网 乌鲁木齐新华智原互联网科技学校 广州新华互联网科技学校电竞方面 互联网营销推广黑科技 数字互联网科技有限公司
0