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. Unix Linux 通用vi命令,使用帮助手册【珍藏版】

    Vi 简介 Vi 是 Unix 世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台 Unix 机器都会提供这套软体.Linux 当然也有,它的 vi 其实是 elvis(版权问题),不过它们都差不多 ...

  2. django中html过滤器filter

    http://blog.csdn.net/iloveyin/article/details/49560559 safe让Html标签以及一些特殊符号(如<)生效,下面以例子说明: # value ...

  3. SQL SERVER 2012 修改数据库默认位置不立即生效

    今天修改SQL SERVER 2012的数据库默认位置:即数据文件.日志文件默认位置时遇到一个问题,单击"服务器属性"(Server Properties)--> 数据库设置 ...

  4. [Java入门笔记] Java语言基础(三):运算符

    简介 运算符是一种特殊的符号,运算符是通过一定的运算规则操作一个或多个操作数,并生成结果的特定符号,运算符和操作数的有效组合称为表达式. Java中运算符主要分为以下几类: 赋值运算符 算术运算符 关 ...

  5. HTML入门篇

    HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏 ...

  6. Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)

    本节通过日志详细分析 Nova Pause/Resume 操作. 有时需要短时间暂停 instance,可以通过 Pause 操作将 instance 的状态保存到宿主机的内存中.当需要恢复的时候,执 ...

  7. jQuery 3.0 的 Data 浅析

    jQuery 3.0 在6月9日正式发布了,3.0 也被称为下一代的 jQuery .这个版本从14年10月开始,其中发布过一次beta 版(2016/1/14,)和候选版(2016/05/20).一 ...

  8. linux中位置参数变量和预定义变量

    位置参数变量   预定义变量

  9. redis 基础

    一 redis数据类型redis支持5种类型的数据类型,它描述如下的:1. 字符串 Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你 ...

  10. 【Windows编程】系列第九篇:剪贴板使用

    上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...