魔术方法(__toString()+ __call()+ __clone() +__autoload())+单例模式

本文详细介绍了PHP中的魔术方法,包括__toString(), __call(), __clone(), 和__autoload()的使用方法及应用场景。并通过实例展示了如何利用这些魔术方法来增强类的行为。
摘要由CSDN通过智能技术生成
魔术方法
__toString()
__call()
__clone()
__autoload()
Person.class.php

<?php
header('Content-Type:text/html;charset=utf-8');

class Person
{
    public $name = 'tom';

    function say()
    {
        echo '讲话';
    }

    function __toString()
    {
        return '没有我,强行打印对象,是要报错的';
    }
}

$p = new Person();
//var_dump($p);
echo $p;//Object of class Person could not be converted to string in

----------------------------------------------------
__call()
Person.calss.php
<?php 
header("Content-Type:text/html;charset=utf-8");
class Person{
    /*function a(){
        echo "aaaa";
    }
    function b(){
        echo "bbbb";
    }
    function c(){
        echo "cccc";
    }*/
    function __call($method,$args){
        /*echo "不存在的成员方法:".$method;
        echo "<hr/>";
        //args是访问不存在成员方法的参数。格式是数组
        var_dump($args);*/
        //可以将多个功能类似的成员方法写到__call里面
        //判断调用的成员方法是否是之前定义的三个成员方法之一

         $method_array = array("a","b","c");
         if(in_array($method,$method_array)){
            //完成三个方法中的功能
            for($i=0;$i<4;$i++){
                echo $method;
            } 
         }else{
            echo $method."这个成员方法不存在";
         }

    }
}
$p = new Person;
$p->d();

--------------------------------------------------------
Person.calss.php
<?php 
header("Content-Type:text/html;charset=utf-8");

/*
* 4、应用魔术方法__call,将类中两个成员方
* 法改写到魔术方法__call中。 两个方法名称分别为
* a(),输出字符串 hello a,
b()   输出字符串 hello b,
*/
class Person1{
    function __call($method,$args){
        $method_array = array("a","b");
        if(in_array($method,$method_array)){
            echo "hello ".$method;
        }else{
            echo $method."这个成员方法不存在";
        }
    }
}
$p = new Person1;
$p->a();
----------------------------------------------------
__call()克隆
<?php 
class Person{
    public $name;

    function __clone(){
        $this->name="jack";
    }
}
$p = new Person;
$p->name = "tom";
/*echo $p->name;
echo "<hr/>";
$p1 = $p; //$p1和$p 指向同一个堆内存
echo $p1->name;
$p->name = 'jerry';
echo "<hr/>";
echo $p1->name;*/

$p2 = clone $p; //通过clone关键词生成的类对象
                //会在堆内存中复制一个新的堆内存空间
                //使用克隆关键字clone,自动调用__clone();

echo $p2->name;
$p->name = "jerry";
echo "<hr/>";
echo $p2->name;
----------------------------------------------------
__autoload()
<?php 

//include 'Person.class.php';
function __autoload($classname){
    //echo $classname;
    echo $classname."<br/>";//会把Student继承Person这两个类都打印出来
    include $classname.'.class.php';//要和实例化名字一致
}
//实例化类Person
/*$p = new Person;
//$db = new DB;
$p->name = "tom";
echo $p->name;*/
$s = new Student;
----------------------------------------------------
单例模式
<?php 
//单例模式应用举例
/*
 * 6、定义Single类,对该类实现单例模式。
 */
class Test{
    public $name = "tom";
    static $obj = null; 

    //构造方法
    private function __construct(){

    }

    //定义成员方法,在类里面实例化类,获取类对象
    static function getObj(){
        if(is_null(self::$obj)){
            //若静态化成员属性$obj是空,则允许实例化
            //Test类,将实例化后的类对象保存在
            // 静态化成员属性$obj中,保存一次以后
            //则静态化成员属性$obj不再为空
            self::$obj = new Test;         
        }       
        //return 类对象,则调用getObj成员方法
        //可以获取类对象       
        return self::$obj;
    }

    function __destruct(){
        echo "bye";
    }
}
//在类外通过类名称访问成员方法
$obj = Test::getObj();
echo $obj->name;

$obj1 = Test::getObj();
echo $obj1->name;

Single.class.php---------------------------------

<?php 
//6、定义Single类,对该类实现单例模式。
class Single{
    static $obj = null;
    //禁止类在类外被实例化,构造方法私有化
    private function __construct(){

    }

    //在类里实例化类获取类对象
    static function getObj(){
        /*
         * 判断静态化成员属性obj是否为空
         * 若为空则进行实例化,并把实例化后的结果
         * 负值给静态化成员属性obj,此时
         * 静态化成员属性obj不为空,里面存储着类对象
         * 若不为空,则不进行实例化,直接将
         * 静态化成员属性obj里面装的类对象直接返回
         */
        if(is_null(self::$obj)){
            //此时 self::$obj 存储Single类的类对象
            self::$obj = new Single;
        }
        return self::$obj;
    }

}
//在类外对成员方法的访问:
//类对象->成员方法
//类名称::成员方法
$s = Single::getObj();

$s1 = Single::getObj();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值