php的__autoload和php的__call
首先, __call是php语言自身就具有的一种语言features...,不是thinkphp的语言特征.
关于__call参考: http://love-love-l.blog.163.com/blog/static/21078304201042492356650/
php是一种若类型语言, 对变量类型没有做强制要求, 如false, 0, null, ""被认为是像等的, 所以在某些额
函数的最后,如果要进行类型区分, 要指明 参数 $strict = true
- __call是针对类的对象/实例而使用的, 而__callStatic是针对类的静态方法使用的;
- __call有两个参数, 一个是方法名称, 一个是这个方法所带的参数组成的args. 记忆这两个参数还是比较间单的,
只要你想到, __call可以实现php的"多态", 可以根据函数名和参数的类型而调用不同的私有方法:
就好了.
PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方 法,__call 方法将会被自动调用。
<?php
class foo {
function __call($name,$arguments) {
print("Did you call me? I'm $name!"); //这里使用的是print, 而不是echo!
}
} $x = new foo();
$x->doStuff();$x->fancy_stuff();
?>
这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。
// 使用 __call 实现“过载”动作
<?php
class Magic {
function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
} private function foo_for_int($x) {
print("oh an int!");
} private function foo_for_string($x) {
print("oh a string!");
}
}
$x = new Magic();
$x->foo(3);
$x->foo("3");
?>
关于__autoload, 参考: http://www.jb51.net/article/31399.htm
为什么说__autoload是解决自动加载的问题的方案?
是因为: 如果我门在new 一个类的时候, 首先要包含这个类对应的类文件, 即require/require_once...
如果要包含/需求的 类文件比较多, 就要写多个require, 这个就显得比较繁琐.
然后, 我们就可以使用__autoload的机制, 在__autoload中, 来require所需要的类文件. 而且是在__autoload方法函数中, 实现: 能够根据类名 而自动require 类文件.
什么叫"加载"? 就是: 包含require_once类所对应的类文件...
__autoload可以实现两种方式的 自动载入 类所对应的 类文件. ...
但是在一个文件中, 只能有一个 autoload方法, 如果你的项目中有一个了 atuoload方法, 你又引用了别人的项目, 而且也包含了一个autoload方法, 那么两个方法,就冲突了, 这种情况下, 你可以将两个__autoload方法 合并成一个方法, 也可以使用 spl(standard php library),来注册多个autoload方法: spl_autoload_register...
注意spl_autoload_register方法, 里面是一个 匿名函数. 参数是 $class_name...
如同jquery中的方法一样, 使用方法还是很简单的.
重要的是: __autoload或 spl_autoload_register 都是 全局函数!!! 是放在 <?php 中的, !!! 不是放在 类定义中的 !!!
**为什么要使用 print, 而不使用echo?
因为print直观, 而且有明确的 "语义"! 而且符合程序员的使用习惯, 所以更多的使用print, 而不使用echo.
另一个区别是: print总是有返回值, 而且返回值总是1, 而echo没有返回值??
annoyance: n. 麻烦, 烦恼; 烦恼的事...
one of the biggest annoyances is having to write a long list of ...
实现文件包含, 自动载入类文件的方式有三种:
为什么下面的代码会报错, 找不到类Foo呢?
$map = array(
'Foo' => 'Foo.class.php',
);
function __autoload($class_name){
if(isset($map['Foo'])){ // 是因为这里$map是局部变量, 外部的$map在这里并没有起作用, 所以$map 为空, 所以就没有包含进来!! 故而出错! 方法就是
require_once $map['Foo']; // 如同上面的图所示, 声明$map 为global变量 这样外部的$map就可以在这里可见了...
}
}
php的__autoload和php的__call的更多相关文章
- PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...
- PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload
1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr
PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...
- PHP5中__call、__get、__set、__clone、__sleep、__wakeup的用法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__w ...
- PHP中的11个魔术方法总结:__construct,、__destruct、__call等
PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep
PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...
- __autoload()尝试加载未定义的类
在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可.PHP5 以后提供了这样一个方法可以自动完成加载所需的类文件. 参见官网的例子: ./myClass. ...
- 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...
- phpexcel引入MVC框架会导致__autoload引入类文件失败的解决办法
Autoloader.php 的register和load方法 register方法 if (function_exists('__autoload')) { // Register any exis ...
随机推荐
- 记工作中用到的抓取oracle表结构的sql语句
以下是SQL,生成的结果中是否为主键和是否可为空,是不准确的 ,没有关联相关的系统表: select '' as 业务源系统, t2.TABLE_NAME 表名称, nvl(t3.comments,' ...
- 内网渗透之如何玩转Meterpreter?(nc.exe)
十.Meterpreter常用命令 1.基本命令(包含meterpreter和msf终端.ruby接口.目标shell交互的命令) background(进程隐藏至后台) sessions(查看已经成 ...
- python 试题归纳及答疑 更新中.....
一.Python基础篇(80题) 1.你为什么学习Python? 一.答题思路 1.阐述 python 优缺点 2.Python应用领域说明 3.根据自身工作情况阐述为什么会使用python 1)py ...
- FTL 数字有逗号
Long i=100000000l; Map model=new Map(); model.put("t",i); 在freemarker中显示为100,000,000 想按原样输 ...
- Linux基础命令---文本显示tac
tac 将指定文件中的行,按照反序方式显示.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 tac [选项] ...
- win10 常用设置 桌面出来计算机图标,固定桌面摆好的图标设置方法,电脑设备ID方法
win10 常用设置 桌面出来计算机图标,固定桌面摆好的图标设置方法 桌面右键-->显示设置-->桌面图标设置 电脑设备ID:xxx查看方法:桌面右键-->显示设置-->关于
- idea下导入Tomcat源码
对于web开发者来说,如果明白了tomcat那对于开发还是后面的学习都是有很大益处的,但在网上看了很多的文章,总是没弄好,经历了很久才弄好了,写个文章记录下,希望也能帮助到其他人.下载Tomcat源码 ...
- Hadoop学习笔记之二:NameNode
NameNode对三大协议接口(NamenodeProtocol.ClientProtoco.DatanodeProtocol)进行实现,利用ipc::Server通过三个协议分别向SNN.Clien ...
- IE haslayout的属性及其值
haslayout是IE 渲染引擎的一个内部组成部分.在IE 中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容.为了调节这两个不同的概念,渲染引擎采用了hasl ...
- HashMap和LinkedHashMap区别
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.uti ...