php魔术方法-----__tostring(),__invoke,__call(),__callStatic ...

###__tostring(),__invoke()




- __tostring()方法是在对象当作字符串输出时被自动调用
- __invoke()方法是在对象当作方法时被自动调用

<?php

class Tomato {
public function __tostring(){
return "string";
}
public function __invoke(){
echo "invoke";
}
} $tomato = new Tomato();
echo $tomato; //对象当作字符串输出
$tomato(); //对象当作方法

__call(),__callStatic()




- __call()实现对方法的重载
- __callStatic()实现对静态方法的重载
- implode()等价于spilt()方法

<?php

 class Tomato {
public function __call($name, $arguments){
echo '$name:'.$name.'$arguments:'.implode(", ", $arguments);
}
public static function __callStatic($name, $arguments){
echo '$name:'.$name.'$arguments:'.implode(", ", $arguments);
}
}
$tomato->runSet("Allo", "Bllo"); //类内部没有该方法,是通过__call()重载实现的
Tomato::deRunSet("Cllo", "Dllo"); //类内部没有该静态方法,是通过__callStatic()重载实现的
?>

__get(),__set()__isset(),__unset(),__empty()




- 获取对象属性时__get()被自动调用,一般用于获取私有属性
- 设置对象属性时__set()被自动调用
- isset判断是否存在该属性,empty相反
- 释放变量时__unset(),被自动调用

<?php

 class Tomato {
private $name = "火星情报局";
public function __get($name){ //参数为属性名
if(isset($name)){ //isset判断是否存在该属性,与empty相反
echo "存在";
echo $this->name;
}else{
return null;
}
}
public function __set($name, $value){ //参数为 属性名、属性值
echo $this->$name = $value; //设置属性
} public function __unset($name){ //释放属性变量时,被自动调用
echo "null";
}
}
$tomato->name; //获取元素属性
$tomato->name = "提莫队长"; //设置元素属性
unset($tomato->name); //释放变量
?>

__clone()




- __clone(),在对象被克隆时调用
- 克隆后的对象具有与原对象相同的所有属性、方法
- 克隆后的对象属性的改变不影响原对象,即互不影响
- __clone()方法内部可以设置哪些属性不必克隆,用自己设置即可

<?php

 class Tomato {
private $name = "火星情报局";
private $title = "沈梦晨";
private $data = "2016";
public function __clone(){
echo $this->name = "老坛酸菜"; //该属性不必克隆,用自己设置的
}
}
$tomato2 = clone $tomato; //克隆对象
$tomato2->data="2017"; //通过克隆对象该变属性
$tomato->name; //获取原对象属性
$tomato->title; //原对象属性
$tomato->data; //获取原对象属性,发现没有改变
$tomato2->name; //获取现对象属性
$tomato2->title; //克隆对象属性,与原对象不一样
$tomato2->data; //获取克隆对象属性,发现改变
?>
  • 综上,克隆后的对象属性的改变不影响原对象
  • 克隆的过程中,可以自己设置自己的值,没必要完全克隆(根据实际情况)

php魔术方法使用场景的更多相关文章

  1. php数组去重、魔术方法、redis常用数据结构及应用场景

    一.用函数对数组进行去重的方法 1.arrau_unique函数的作用 移除数组中重复的值. 将值作为字符串进行排序,然后保留每个值第一次出现的健名,健名保留不变. 第二个参数可以选择排序方式: SO ...

  2. PHP 类中的魔术方法

    定义: PHP类中以两个下画线“__”开头的方法被称为魔术方法. 分类: 例如:构造方法:__construct:析构方法:__destruct:动态重载:__set().__get().__call ...

  3. PHP魔术方法小结.md

    说明 魔术方法就是在特定场景下不需要调用而自动执行的方法.因为有魔术方法,所以我们的类可以写得很灵活~ __construct #构造方法,在类被实例化时自动调用,一般用于初始化操作; __destr ...

  4. PHP 魔术方法 __call 与 __callStatic 方法

    PHP 魔术方法 __call 与 __callStatic 方法 PHP 5.3 后新增了 __call 与 __callStatic 魔法方法. __call 当要调用的方法不存在或权限不足时,会 ...

  5. PHP:__get()、__set()、__isset()、__unset()、__call()、__callStatic()六个魔术方法

    哎呀呀,今天小仓鼠学到了魔术方法,简称魔法,哈哈哈哈,神经病啊~ 平时在面试的时候,也会遇到问魔术方法有哪些的问题哦!今天我们来了解一下下~ 1.__get() 形式: __get($objName) ...

  6. Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__

    魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...

  7. Pthon魔术方法(Magic Methods)-上下文管理

    Pthon魔术方法(Magic Methods)-上下文管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上下文管理方法 __enter__: 进入与此对象相关的上下文.如果 ...

  8. Pthon魔术方法(Magic Methods)-运算符重载

    Pthon魔术方法(Magic Methods)-运算符重载 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Python运算符对应的魔术方法 1>.比较运算符 <: ...

  9. 魔术方法之__call、__callStatic

    1.__call() 作用,当调用不存在的方法时,会调用该方法.实际应用,当程序调用不存在的方法时,意外导致程序终止. .或者当你调用了受保护的或者是私人的方法时,也会自动调用__call方法 结果: ...

随机推荐

  1. //build->//learn->//publish

    在今年的Build大会上,微软发布了Windows Phone 8.1,以及universal Windows apps开发策略.在接下来的两个月中,会有两个全球性的活动举办,分别是//learn和/ ...

  2. x01.os.19: linux 0.0

    linux 0.0 是一个丢失的版本,但赵炯老师又在 linux 0.11 的基础上,使它起死回生.www.oldlinux.org 有大量资源可供下载,值得一看. 1.要编译运行,首先需安装:sud ...

  3. android 复制字符串到剪贴板

    public static void CopyToClipboard(Context context,String text){ ClipboardManager clip = (ClipboardM ...

  4. strcat 函数的实现

    原型        extern char *strcat(char *dest,char *src); 用法        #include <string.h> 功能        把 ...

  5. ECharts 初体验

    缘起 ECharts,缩写来自Enterprise Charts,商业级数据图表,它最初是为了满足公司商业体系里各种业务系统(如凤巢.广告管家等等)的报表需求.以前这些系统的图表需求我们都是使用fla ...

  6. java设计模式之原型模式

    原型模式概念 该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.java中复制通过clone()实现的.clone中涉及深.浅复制.深.浅复制的概念如下: ⑴浅复制 ...

  7. 【2016-10-31】【坚持学习】【Day16】【MongoDB】【入门 -概念】

    MongoDB 概念解析 不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档.集合.数据库,下面我们挨个介绍. 下表将帮助您更容易理解Mongo中的一些概念: SQL术 ...

  8. codevs 1115 开心的金明--01背包

    1115 开心的金明 2006年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 金明今天很开心,家里购 ...

  9. Qt 之 饼图

    Qt 库由许多模块组成,其中的 Qt Charts,包含了一系列图表组件. 1  饼图 (pie chart) 1.1  Charts 模块 .pro 中添加如下语句: QT += charts 头文 ...

  10. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...