类的模式方法都是 public 的,以 两个下划线开头,在某些情况下自动被调用,有点类似 hook 或者 事件触发。

魔术方法的传参方式不能使用引用。

__construct() :

构造函数,实例化对象时调用,可以接收传入的参数

__destruct():

析构函数,对象被注销、脚本结束、对象的所有引用被删除时调用(垃圾回收),该函数不能接收参数,析构函数可以在代码中被显示调用,但是不建议这样做,应该由系统在垃圾回收时自动调用。

__call(string methodName, array arguments):

试图调用一个不存在的方法时被调用,这在 PHP 框架的路由设计中很有用,比如 传了一个错误的路径解析出一个不存在的 action,或者是某种有意设计成的路劲规则 ,可以用该方法灵活处理:按路劲的信息直接指向某个文件或跳转到错误页面。

static __callStatic(string methodName, array arguments):

试图调用一个不存在的静态方法时调用,这个方法应该声明为静态方法。

__get(string key):

试图通过对象访问一个不能访问的属性(不存在的属性或保护、私有属性)时被调用,应该返回一个值。

例如  $obj->key ; //key 属性不存在或不是 public 是就会触发 __get(),并获得返回值(或者你也可以直接抛出错误,或做其他处理)

如果使用 empty() 来检测一个对象通过 __get() 方法返回的属性值,将得到 true, 而 isset() 的检测将得到 false.

__set(string key):

试图通过对象为一个不能访问的属性赋值时被调用,该方法的返回值被忽略。

__isset(string key) :

当使用 isset() 或 empty() 检测一个无法在外部访问的对象属性时被触发,应当返回 bool 值。

__unset(string key) :

对一个无法在外部访问的对象属性使用 unset() 注销时被触发

__sleep() :

对一个对象进行使用 serialize() 序列化时被调用,返回一个以属性名称为元素的数组告诉脚本应该保存对象的哪些属性值。

__wakeup():

对一个对象系列化字符串( 通过 serialize($obj)得到的字符串 )使用 unserialize() 反序列化时被调用。

复制代码 代码如下:

class Connection {

protected $link;

private $server, $username, $password, $db;

public function __construct($server, $username, $password, $db)   {

$this->server = $server;

$this->username = $username;

$this->password = $password;

$this->db = $db;

$this->connect();

}

private function connect()  {

$this->link = mysql_connect($this->server, $this->username, $this->password);

mysql_select_db($this->db, $this->link);

}

public function __sleep()   {//系列化时只需保存这些属性的值

return array('server', 'username', 'password', 'db');//必须返回一个数组

}

public function __wakeup()  { //反系列化得到对象后立即连接数据库

$this->connect();

}

}

__toString():

试图将对象作为一个字符串使用时被调用,返回一个字符串,类似 js 对象的 toString()

__invoke():

将一个对象作为函数调用时被调用。如

$object($a,$b) 将调用  $object->__invoke($a,$b)

__set_state() :

对一个对象使用 var_export() 时被调用,其返回值将被打印

__clone():

对一个对象使用 clone 操作时被调用,无返回值,该方法可用于 在返回 clone 得到的对象之前修改其属性使得 clone 得到的对象与 被操 作的对象属性值可以不同,但并不能通过返回 null 或 false 来阻止 对象克隆操作, clone 操作得到的对象不是通过该方法的返回值返回 的。

注意事项:

__get、__set 方法可常用于灵活处理 对象私有属性、保护属性的访问。

由于 PHP 对象对于的方法使用 isset() 或 empty() 判定时,不会认为 方法是一个可访问的属性(写多了 javascript 要注意了,PHP 里面 属性就是属性方法就是方法不可混淆)

在使用 __get 时 ,你可能会在该方法中对属性使用 isset($this->key) 判断,尤其是要特别处理 私有属性的时候,这时要注意 __set() 有没有定义以及如何定义以免出现误判。

如果一个对象的方法在调用时不需要传参,或者传参是固定的,可以通过 __get() 方法来将方法属性化,在 __get() 里面自动调用该方法并将值返回。

比如在类内定义 __get 方法如下:

复制代码 代码如下:

public function  __get($key){

if(property_exists($this,$key)){

return $this->$key; //私有、保护属性允许访问

}else if(method_exists($this,'get'.$key)){

return $this->{'get'.$key}();

//或者....

// $methodName = 'get'.$key;

//return $this-> $methodName();

}else{

thrown new Exception('class '.__class__.' do not has property '.$key);

}

}

//方法属性化访问:

$obj->getModelName();

$obj->ModelName; //属性化

unserialize() 方法:当试图反序列化一个对象时,该函数需要知道对象的 类,如果这个系列化字符串从其他方式得来,脚本环境中没有定义对象的类,就需要将类的文件引入,unserialize() 第二个参数是可选的 callback 型参数,用于引入类所在的文件。

function importClass($calssName){

include('xxxx.php');  //包含该类的文件

}

unserialize($objstr,$callbackName);

类的自动加载: __autoload()

__autoload() 是PHP执行环境中约定的一个函数而非某个类的方法,如果一个类在使用之前没有加载到当前文件,会自动调用 __autoload() 函数来加载该类,通常这些类的加载规则都是约定的,比如这些类包含在以类名命名的文件内,该方法可以实现类的按需加载,避免脚本执行前加载不必要的类从而降低资源占用、提交性能。

注意:__autoload() 内的错误不能被 try-catch 捕获。

复制代码 代码如下:

function __autoload($class_name){

require_once(PATH.'/calsses/'.$class_name.'.php');

}

$obj1 = new mycalss1();

注册 __autoload() 自动调用的函数:

spl 代码库在 PHP5.0 之后默认自动启用

spl_autoload_register([callback]); //不将具体实现的加载代码写在 __autoload() 内,可使用该函数注册回调函数。

如果使用类的方法作为回调函数需要传入一个数组:

spl_autoload_register(array('class_name'|$obj,'method_name'));

例如:

spl_autoload_register(array($this,'autoloadClass'));

spl_autoload_register(array('YiiBase','autoload'));// YII 框架的自动加载类的实现, YiiBase 类实现了一个autoload 方法。

spl_autoload_register() 可以注册多个加载函数,成功加载类文件之前将逐个尝试所有注册的加载函数。这在不同的类使用不同逻辑来导入类文件的时候很有用。

spl_autoload_unregister(); //取消某个注册的加载函数,参数与 spl_autoload_register() 相同.

spl_autoload_functions();// 以数组形式返回所有注册的 __autoload() 函数

spl_autoload(class_name[,file_extentions]); // __autoload() 函数的默认实现。 spl_autoload_register() 被调用时如果没有传入 函数名,则默认使用该函数,该函数的执行规则是: 类名转为小写作为文件名,传入的 file_extentions(多个扩展名以逗号隔开,默认为 .inc 和 .php)为扩展名,根据得到的文件名尝试在 php.ini 内设置的 include paths 中搜索。

spl_autoload_call(class_name);//手动调用所有注册的 __autoload() 函数来主动加载类文件

spl_autoload_extentions([file_extentions]); //注册或返回 spl_autoload() 中可以使用的文件扩展名,扩展名可以是 .a.b 这样的形式,例如:

spl_autoload_extentions(".class.php");

spl_autoload_register(); //使用spl_autoload() 来尝试自动加载类文件

//这样 spl_autoload('myclassName'); 会尝试加载 文件 "myclassName.class.php" .

php 类自动执行,php类中的魔术方法及类的自动加载相关推荐

  1. 在命令窗口执行java文件时,提示找不到或无法加载主类

    在命令窗口执行java文件时,提示找不到或无法加载主类 以前写java代码的时候,都是在Eclipse或者IDEA等集成开发工具上进行,所以编译和测试代码的时候都是一键执行,其中的原理简单来说,就是先 ...

  2. python类定义以及调用_python中如何定义和调用类详解

    类的方法的定义 1.def fun_name(self,...); Pass 2.其中的参数self代表类的实例,在调用方法时由系统自动提供 3.方法定义时必须指明self参数 类的方法的调用 与普通 ...

  3. jAvA中deprecate,在Java中使用Deprecated方法或类是错误的吗?

    1.在Java中使用Deprecated方法或类是错误的吗? 从已弃用的定义 : 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者是因为存在更好的selec ...

  4. java执行jar中的main_浅谈java 执行jar包中的main方法

    浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...

  5. DWZ 用dialog调用MVC自动生成的密码修改页面一直出现“数据加载中,请稍等...”和去掉“数据加载中,请稍等”的方法

    在MVC框架中调用JS框架<DWZ富客户端框架>在用dialog调用自动MVC系统自动生成的密码修改页面一直出现"数据加载中,请稍等..."的问题. <a tit ...

  6. java打包成jar|执行jar包中的main方法

    java打包成jar jar -cvf [jar包的名字] [需要打包的文件] 执行jar包中的main方法 java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...

  7. pyhton中的魔术方法

    魔术方法 ***** 特殊属性 属性 说明 __name__ 类.函数.方法等的名字 __module__ 类定义所在的模块名 __class__ 对象或类所属的类 __bases__ 类的基类的元组 ...

  8. PHP5中的魔术方法

    一. __construct(),类的构造函数 php中构造方法是对象创建完成后第一个被对象自动调用的方法.在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空 ...

  9. 巧用PHP中__get()魔术方法

    PHP中的魔术方法有很多,这些魔术方法可以让PHP脚本在某些特定的情况下自动调用.比如 __construct() 每次实例化一个类都会先调用该方法进行初始化.这里我们讲一下__get() 魔术方法的 ...

最新文章

  1. 常用的渗透测试工具SQLMap
  2. SQLite 语法(http://www.w3cschool.cc/sqlite/sqlite-syntax.html)
  3. mysql 5.5 不认识 datetime(0) 类型
  4. [svc]cfssl模拟https站点-探究浏览器如何校验证书
  5. 下载网页中的图片到本地
  6. Mr.J-- HTTP学习笔记(八)-- 网关
  7. Oracle 技术集锦
  8. Solidity 教程系列2 - 地址类型介绍
  9. Android性能专项FPS测试实践
  10. 一键PDF转Word,PP-Structurev2文档分析模型深度解读!
  11. [UML] 如何找参与者、找用例
  12. PYTHON应用行业,PYTHON就业方向
  13. oracle11g 网页账号,oracle11g 创建用户并受权
  14. ensp ethernet端口配置ip问题
  15. centos 6 python django mysql_CentOS 6.5中部署django+uwsgi+nginx+mysql项目
  16. r语言实现岭回归_R语言回归篇
  17. AndroidAPI
  18. 新手常见(五国)(-v图)错误解决(原版,破解kernel,补丁kext下载)
  19. 那些选择网络工程的女生们,后来都怎么样了?
  20. 三星android强制关机,三星怎么强制关机

热门文章

  1. Hibernate - HHH000352: Unable to release batch statement
  2. Unity3D-5.3.5发布VR项目到Android
  3. Lua实现二进制串与Hex显示串的相互转换
  4. PAT (Basic Level) Practice (中文)1041 考试座位号 (15 分)
  5. Go 在 TiDB 的实践
  6. 【Android】Error:Execution failed for task ':app:lint'
  7. Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决(转)...
  8. Spring的javaMail邮件发送(带附件)
  9. Js原生元素选择器 _$获取id class attr 属性集合
  10. http请求消息体和响应消息体