魔术方法
__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();
魔术方法(__toString()+ __call()+ __clone() +__autoload())+单例模式
最新推荐文章于 2021-08-16 07:20:45 发布
本文详细介绍了PHP中的魔术方法,包括__toString(), __call(), __clone(), 和__autoload()的使用方法及应用场景。并通过实例展示了如何利用这些魔术方法来增强类的行为。
摘要由CSDN通过智能技术生成