您的位置:首页 > 其它

面向对象 魔术方法 __clone() __toString() __call() __autoload()

2017-09-28 16:00 218 查看
__clone() 在克隆对象时被自动调用


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

class demo{
public $name;
public $age;
public function __construct($name,$age){
$this -> name = $name;
$this -> age = $age;
}
public function say(){
echo 'say';
}
/*
* 魔术方法
* __clone() 在克隆对象时被自动调用
* 作用:在对新对象的成员属性进行修改
*/
public function __clone(){
$this -> name = '罗宾';
$this -> age = 20;
}
}
$demo = new demo('娜美',18);
$demo -> say();
$demo1 = clone $demo;
echo "<hr/>";
$demo1 -> say();
echo "<br/>";
var_dump($demo1);
__toString() 直接 echo 或 print 对象时被自动调用


class box{
public $name;
public function __construct($name){
$this -> name = $name;
}
/*
* 魔术方法
* __toString() 直接 echo 或 print 对象时被自动调用
* 作用:可以直接返回字符串或用于调用流程处理
* 
*/
public function __toString(){
$this -> d();
return '自动调用....';
}
private function d(){
echo 'd.....';
}
}
$box = new box('娜美');
echo $box;
__call() 在调用一个不存在的方法时被自动调用


class happy{

private $sql = array(
'table'=>'',
'field'=>'*',
'where'=>'',
'order'=>'',
'limit'=>''
);

/*
* 魔术方法
* __call() 在调用一个不存在的方法士被自动调用
* 参数1:调用的方法名
* 参数2:调用方法时传递的参数列表(数组)
*/
/*public function __call($methodName,$args){
echo "调用方法{$methodName}(),参数:";
print_r($args);
echo "不存在";
}*/

public function __call($methodName,$args){
/*判断数组内有没有这个下标*/
/*为了处理方法由客户传过来没有定义需要进行判断处理*/
if (array_key_exists($methodName, $this->sql)) {
/*如果是 就进行赋值操作*/
$this -> sql[$methodName] = $args[0];
} else {
/*如果不是 就给出提示信息*/
die("你调用的方法{$methodName}()不存在!");
}

$this -> sql[$methodName] = $args[0];
/*返回对象,为了实现连贯操作*/
return $this;
}
public function open(){
//		$sql = "select * from user where id > 5 order id desc limit 0,10";
if($this -> sql['where']){
$where = "WHERE {$this -> sql['where']}";
}
if($this -> sql['order']){
$order = "ORDER {$this -> sql['order']}";
}
if($this -> sql['limit']){
$limit = "LIMIT {$this -> sql['limit']}";
}
$sql = "SELECT {$this->sql['field']} FROM {$this -> sql['table']} {$where} {$order} {$limit}";
echo $sql;
}
}

$happy = new happy();
//$happy -> selet('a','b');
//aa('aaaa') 这个方法由客户传过来没有定义需要进行判断处理
//$happy -> aa('aaaa');

$happy -> table('user') -> field('id,username,pwd') -> limit('0,10') -> order('id DESC') -> where('id<100') -> open();
echo "<pre>";
var_dump($happy);
__autoload() 在实例化对象时,如果类不存在就会被自动调用


function __autoload($className){
/*
* 魔术方法
* __autoload() 在实例化对象时,如果类不存在就会被自动调用
* 参数:实例化的类名
* 作用:可以用于自动引入类文件
* 
* 注意:类文件名要有规律 
* 	         类文件的名要与类名统一的部分
* 	         类文件的路径要有规律
*/
$file = $className.".class.php";
$path = "./class/".$file;
/*判断文件是否存在*/
if(file_exists($path)){
include($path);
}else{
die("你调用的{$className}.class.php文件不存在");
}

echo $path;
}

$pird = new prid();
var_dump($prid);






                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐