首先, __call是php语言自身就具有的一种语言features...,不是thinkphp的语言特征.

关于__call参考: http://love-love-l.blog.163.com/blog/static/21078304201042492356650/

php是一种若类型语言, 对变量类型没有做强制要求, 如false, 0, null, ""被认为是像等的, 所以在某些额

函数的最后,如果要进行类型区分, 要指明 参数 $strict = true

  1. __call是针对类的对象/实例而使用的, 而__callStatic是针对类的静态方法使用的;
  2. __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的更多相关文章

  1. PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...

  2. PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  3. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  4. PHP5中__call、__get、__set、__clone、__sleep、__wakeup的用法

    __construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__w ...

  5. PHP中的11个魔术方法总结:__construct,、__destruct、__call等

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  6. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  7. __autoload()尝试加载未定义的类

    在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可.PHP5 以后提供了这样一个方法可以自动完成加载所需的类文件. 参见官网的例子: ./myClass. ...

  8. 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

    很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...

  9. phpexcel引入MVC框架会导致__autoload引入类文件失败的解决办法

    Autoloader.php 的register和load方法 register方法 if (function_exists('__autoload')) { // Register any exis ...

随机推荐

  1. 向量体系结构(2)----SIMD指令集扩展和GPU

    进行SIMD多媒体扩展的设计,源于一个很容易观察到的事实: 许多多媒体应用程序操作的数据类型比对32位处理器进行针对性优化的数据类型更窄一些. 图像三基色,都是8位.音频采样也都是8位和16位来表示. ...

  2. C#基础知识整理

    年时,北风吹雁雪纷纷,一条秋裤冻上头.冷的连手都懒得动,就随便翻翻书,也没有更新博客,如今年已过,开始投入到正常的工作状态中,趁现在需求还没有来,把C#基础知识梳理一下,其实一直以来就想这样做的,对于 ...

  3. Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确

    Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确 目录在/etc/ngnix/conf.d下找出nginx配置文件路径和测试配置文件是否正确# /usr/sbin ...

  4. Fiddler4入门--手机抓包工具安装和使用说明

    Fiddler4入门--手机抓包工具安装和使用说明.电脑最好是笔记本连同一个wifi,这样能和手机保持统一局域网内. 很多区块链dapp项目方风控做的很差,利用fiddler抓包分析找一些漏洞,然后利 ...

  5. java 数组和集合

    1.概念说明 区别:数组固定长度的,集合,数组的长度是可以变化的. List,继承Collection,可重复.有序的对象 Set,继承Collection,不可重复.无序的对象 Map,键值对,提供 ...

  6. 几种线程安全的Map解析

    转载自 面试必问-几种线程安全的Map解析 HashMap线程安全的吗? Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局 ...

  7. qt之qmake

    qt之qmake qmake 10分钟学会使用qmake 创建一个项目文件 qmake使用储存在项目(.pro)文件中的信息来决定Makefile文件中该生成什么. 一个基本的项目文件包含关于应用程序 ...

  8. FAQ About WOYO PDR007 Dent Removal Heat Induction System

    WOYO PDR 007 is a dent repair tool for auto maintence. WOYO PDR007 Auto Body Paintless Dent Repair K ...

  9. Django框架----模板语法

    Django模板系统 官方文档 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 只需要记两种特殊符号: {{  }}和 {% %} 变量 ...

  10. java之异常统一处理

    spring-mvc.xml <!-- aop --> <aop:aspectj-autoproxy/> <beans:bean id="controllerA ...