__clone()  - 当对象克隆的时候自动加载此方法

__toString() - 当对象需要echo打印输出的时候自动加载此方法

__clone()

<?php
class example{
public static $pa;
public $pb;
public function __construct(){
$this->pb = ++self::$pa;
} public function __clone(){
$this->pb = 'no zuo no die';
}
} $a = new example;
$b = new example;
$c = clone $b;
$b->pb = 'I Love You So Much!'; echo $a->pb;
echo '<hr/>';
echo $b->pb;
echo '<hr/>';
echo $c->pb;
echo '<hr/>';
echo $b->pb;
?>

结果如下

------------------------------------------------------------------------------------
I Love You So Much!
------------------------------------------------------------------------------------
no zuo no die /*要不是有__clone()这个魔术方法,这边的结果应该是2*/
------------------------------------------------------------------------------------
I Love You So Much!

php手册给了我们一个例子有些难以看懂,如下

<?php
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()
{ // 强制复制一份this->object, 否则仍然指向同一个对象
$this->object1 = clone $this->object1;
}
} $obj = new MyCloneable(); $obj->object1 = new SubObject();
$obj->object2 = new SubObject(); $obj2 = clone $obj; print("Original Object:\n");
print_r($obj); print("Cloned Object:\n");
print_r($obj2); ?>

最后的结果

Original Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] =>
) [object2] => SubObject Object
(
[instance] =>
) )
Cloned Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3 /*可能这里比较难以理解,其实就是$obj2当克隆的时候将最后的instance为2的结果克隆,并且再执行SubObject::__clone方法*/
) [object2] => SubObject Object
(
[instance] =>
) )

__toString()

<?php
// Declare a simple class
class TestClass
{
public $foo; public function __construct($foo)
{
$this->foo = $foo;
} public function __toString() {
return $this->foo;
}
} $class = new TestClass('Hello');
echo $class;
?>

结果

Hello

PHP 魔术方法 __clone __toString(五)的更多相关文章

  1. PHP面向对象魔术方法之__toString函数

    l 基本介绍: 当我们希望将一个对象当做字符串来输出时,就会触发__toString魔术方法. <?php header('content-type:text/html;charset=utf- ...

  2. PHP魔术方法__clone()篇

    PHP中定义了一个内置方法__clone()来调整兑现的克隆行为: 当一个对象被克隆的时候会自动执行__clone()方法,而复制的对象可以在其方法内进行调整 header('Content-type ...

  3. PHP常用魔术方法(__toString魔术方法)

    <?php //文件名:index.php define('a',__DIR__); include '/IMooc/Loader.php'; spl_autoload_register('\\ ...

  4. PHP面向对象常见的关键字和魔术方法

    在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...

  5. PHP魔术方法和魔法变量详解

    一.魔术常量 __LINE__ 文件中的当前行号.__FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名. 自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对 ...

  6. 20191125PHP抽象类、接口和魔术方法

    抽象类 不能被实例化,用于其他类的继承.使用abstract(抽象).抽象方法一定是抽象类,抽象类不一定有抽象方法. 接口interface是特殊的抽象类. eg: <?php //抽象类 ab ...

  7. php中魔术方法有什么用

    在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发. __construct ...

  8. PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...

  9. PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

随机推荐

  1. mysqldump的流程

    发布时间:2013 年 4 月 6 日 发布者: OurMySQL 来源:P.Linux Laboratory      前几天看到群里在讨论mysqldump导致锁表的问题,为什么一个表已经dump ...

  2. XCode帮助文档离线下载解决办法

    1.菜单栏Xcode->Preferences选择Documentation,在线下载 2.离线下载(用迅雷即可下载) 在上述在线下载列表中,点击某一列,下拉框可看见 info,可得到其网络所在 ...

  3. VBA Excel 常用 自定义函数

    1. 将 互换 Excel 列号(数字/字母) Public Function excelColumn_numLetter_interchange(numOrLetter) As String Dim ...

  4. Debian 7 升级内核

    Debian 7(wheezy)的内核是3.2,要想把内核升级到3.16怎么办呢?使用backports源! 一.添加backports源 打开/etc/apt/source.list文件,加入以下: ...

  5. 线程NSThread的使用

    // // ZYThreadViewController.h // Thread // // Created by yejiong on 15/11/4. // Copyright © 2015年 z ...

  6. 求教。。 为什么加载到servlet页面显示空白或者一直加载页面没显示也没错误?

    package com.bean; public class Example7_2_Bean { String[] columnName;// 存放列名 String[][] tableRecord ...

  7. Windows Azure 微软公有云体验(二) 存储成本比较分析

    Windows Azure 微软公有云已经登陆中国有一段时间了,现在是处于试用阶段,Windows Azure的使用将会给管理信息系统的开发.运行.维护带来什么样的新体验呢? Windows Azur ...

  8. 【报错】"The constructor Notification(int, CharSequence, long) is deprecated

    Notification的构造方法 Notification(int, CharSequence, long) 在API11之后就淘汰了,之后的API需要用Notification.Builder() ...

  9. ganglia监控hadoop2.0配置方法

    ganglia监控hadoop2.0配置方法前提:hadoop2.0集群已安装ganglia监控工具第一步:Hadoop用户登录集群每一个节点,修改文件:vi /opt/hadoop-2.0.0-cd ...

  10. WIN7 X64 如何运行debug

    WIN7 X64 如何运行debug 下载debug.exe 安装dosbox 安装完成后将debug.exe放入某个盘的根目录下(以c盘为例) 然后运行dosbox,输入 mount c c:\ c ...