PHP 魔术函数 __call()用法
在 PHP 中的方法调用是这样工作的。首先,PHP 解释器在类上查找方法。如果方法存在,PHP 就调用它。如果没有,那么就调用类上的魔术函数 __call(如果这个方法存在的话)。如果 __call 失败,就调用父类方法,依此类推。
这样红口白牙的说似乎有点太变态了,我们还是举个例子吧,看如下代码:
代码如下 | 复制代码 |
class test{ |
在这个测试类test中,只有个构造函数输出一些可有可无的垃圾字符,别的什么都没有;
这时候我们,把它实例化,并且调用一个原子弹的方法,你猜他会怎么样呢?我们立马就这样做,看着:
代码如下 | 复制代码 |
$send = new test(); |
结果是可想而知的,他一定会告诉你没有这个方法的——咱们的确没有这个原子弹的方法!错误信息如下:
Debug Error: test.php line 9 – Call to undefined method test::atomBomb()
那么我们把这个类修改一下,加上一个__call方法,看看怎么样呢:
代码如下 | 复制代码 |
…… public function __call($name,$arg){ 重复上边的调用方式: |
这次看到的结果肯定是和上次不一样的。结果如下:
this is construct! //这个是构造函数自己输出的
//下边这些是__call函数输出的
代码如下 | 复制代码 |
function name:atomBomb arg:Array |
并且我们也很容易的看出,__call两个参数,第一个参数:调用的方法名,第二个参数:调用方法时候输入的参数(这个地方是个数组)。
说这么多不知道你明白没有,我想你要是明白的话,你一定会问这个东西有个什么鸟用呢?就是我们能够用来干什么呢?
那我给你一个用它的思路吧——学以致用嘛!试想,你如果把一个数据库中的所有表都作为一个个对象,并且对其进行CURD操作,你需要写多少个类呢?当然要是你的数组库只有两个表,你完全可以告诉我,只有两个类!但是要是有108个表呢(你例如dede就是108个表),手工输入108个类?显然不科学,21世纪什么最贵?——时间!
我们完全可以写一个类,其余的然他自动创建,我在IBM找了段代码,并且精简了一下,大家可以看看,这个可是高级工程师写的东西啊。
代码如下 | 复制代码 |
class DBObject{ private $id = 0; private $table; private $fields = array(); function __construct( $table, $fields ) { $this->table = $table; foreach( $fields as $key ) $this->fields[ $key ] = null; } function __call( $method, $args ) { if ( preg_match( "/set_(.*)/", $method, $found ) ) { if ( array_key_exists( $found[1], $this->fields ) ) { $this->fields[ $found[1] ] = $args[0]; return true; } } else if ( preg_match( "/get_(.*)/", $method, $found ) ) { if ( array_key_exists( $found[1], $this->fields ) ) { return $this->fields[ $found[1] ]; } } return false; } function insert() { global $db; $fields = $this->table."_id, "; $fields .= join( ", ", array_keys( $this->fields ) ); $inspoints = array( "0" ); foreach( array_keys( $this->fields ) as $field ) $inspoints []= "?"; $inspt = join( ", ", $inspoints ); $sql = "INSERT INTO ".$this->table." ( $fields ) VALUES ( $inspt )"; $values = array(); foreach( array_keys( $this->fields ) as $field ) $values []= $this->fields[ $field ]; $sth = $db->prepare( $sql ); $db->execute( $sth, $values ); $res = $db->query( "SELECT last_insert_id()" ); $res->fetchInto( $row ); $this->id = $row[0]; return $row[0]; }</code> //下边删除了3个方法分别是更新update,删除一个,删除全部(战地注) } $book = new DBObject( 'book', array( 'author', 'title', 'publisher' ) ); $book->delete_all(); $book->set_title( "PHP Hacks" ); $book->set_author( "Jack Herrington" ); $book->set_publisher( "O'Reilly" ); $id = $book->insert(); echo ( "New book id = $idn" ); $book->set_title( "Podcasting Hacks" ); $book->update(); $book2 = new DBObject( 'book', array( 'author', 'title', 'publisher' ) ); $book2->load( $id ); echo( "Title = ".$book2->get_title()."n" ); $book2->delete( );…… |
数组是一组有某种共同特性的元素,包括相似性和类型。
每个元素由一个特殊的标识符来区分,称之为key,而每个key都有一个value
1.创建数组的两种方式:
1.1 用array()函数
代码如下 | 复制代码 |
<?php output |
1.2 用range()函数
代码如下 | 复制代码 |
<?php output c o q t |
2.循环访问数组元素的两种方式:
2.1 for循环
代码如下 | 复制代码 |
<?php output |
恒等计算符,和比较运算符号“==”的区别是 “==”不会检查条件式的表达式的类型,恒等计算符会同时检查表达式的值与类型。
这主要和php是无类型语言有关,比如 NULL,FALSE,array(),”",0,”0″这几个值如果用==他们是相等的,但是你如果判断出某个值真正的返回值呢,就可以用 ===
$a = 0;
$b = FALSE;
$a === FALSE 不成立,但 $b === FALSE成立,如果是==, $a == FALSE 和 $b == FALSE都成立
===运算符还是很有用的,php有些内置函数成功会返回某个值,失败会返回false,假如成功了但返回的是”"或者0之类的空值你怎么判断成功或者失败呢?这是就可以用 === ,它可以区分变量类型。
参考:
比较运算符
例子 | 名称 | 结果 |
---|---|---|
$a == $b | 等于 | TRUE,如果 $a 等于 $b。 |
$a === $b | 全等 | TRUE,如果 $a 等于 $b,并且它们的类型也相同。(PHP 4 引进) |
$a != $b | 不等 | TRUE,如果 $a 不等于 $b。 |
$a <> $b | 不等 | TRUE,如果 $a 不等于 $b。 |
$a !== $b | 非全等 | TRUE,如果 $a 不等于 $b,或者它们的类型不同。(PHP 4 引进) |
$a < $b | 小与 | TRUE,如果 $a 严格小于 $b。 |
$a > $b | 大于 | TRUE,如果 $a 严格 $b。 |
$a <= $b | 小于等于 | TRUE,如果 $a 小于或者等于 $b。 |
$a >= $b | 大于等于 | TRUE,如果 $a 大于或者等于 $b。 |
如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。此规则也适用于 switch语句。
代码如下 | 复制代码 |
<?php var_dump(0 == "a"); // 0 == 0 -> true var_dump("1" == "01"); // 1 == 1 -> true var_dump("1" == "1e0"); // 1 == 1 -> true switch ("a") { case 0: echo "0"; break; case "a": // never reached because "a" is already matched with 0 echo "a"; break; } ?> |
最近买了本php和mysql web开发,看到数组循环语句。值得自己关注下,特此留点字迹,以便以后读阅。
一般foreach用的比较多
代码如下 | 复制代码 |
<?php |
还有个更高级和常见的方法
代码如下 | 复制代码 |
<?php |
以前还真没怎么关注下,今天自己动手,还不错,又了解新的东西了,还是自己太菜了,哎
list()函数可以用来一个数组分解成一系列的值,允许为新变量命名。不懂list的
http://www.111cn.net/phper/24/032a7c95555c423729b071aef4afd3c4.htm
两段代码输出是一样。
需要注意的是,当使用each()函数时候,数组将记录当前元素。如果希望在相同的脚本中使用两次该数组。就需要使用reset()降当前元素重新设置到数组开始处。
代码如下 | 复制代码 |
<?php |
这样就可以依然使用数组$price咯。
-自定义变量
a.不需明示数据类型
b.加'$'
c.以下划线或字母开头
d.以有意义的单词
-全等
a.===
b.判断大小及类型
-数组
创建数组方法
a.array("key"=>"value")
b.array[]=value;
c.explode(separator,string);
常用函数
a.count //统计数组条数
b.is_array //判断是否为数组
遍历数组
Foreach($arr as $key=>$value)
说明: 指针跳转, 自动循环, 依次赋值
-流程控制符
a. break //结束一层循环
break n //结束n层循环
b. continue //结束本次循环
c. return //返回,结束当前脚本运行
d. exit //结束脚本运行
e. return 与 exit的区别:见图
图片:图2-1.JPG
3.函数
-date("Y-m-d G:i:s")
a.Y 表示4位数字完整表示的年份
b.m 数字表示的月份,有前导零
c.d 月份中的第几天,有前导零的2位数字
d.G 小时,24小时格式,没有前导零
e. i 有前导零的分钟数
f. s 有前导零的秒数
注意:假如你显示的时间跟电脑显示时间不一样,也就是相差8小时,可在php.ini里
面将date.timezone = "PRC" //PRC代表中华人民共和
-time() //返回当前的 Unix 时间戳,也就是一串数字
例: $nextWeek=time()+(7*24*60*60);//7天,24小时,60分钟,60秒
echo $nextWeek."<br>";
echo 'now: '.date("Y-m-d")."n";
echo 'Next Week: '.date("Y-m-d",$nextWeek);
date(格式字符,时间戳)
1. 将给定的时间戳以给定的格式输出来
2. 如果省略时间戳,例如前面,则视为当前时间
-自定义函数
a.格式:function 函数名(){}
b.使用与功能相关的名字
function_exists //判断函数
is_array //判断数组
-命名习惯
a.使用良好命名 (必须地,其余仅供参考)
b.函数单词开头大小写
c.常量大写
d. 变量小写
提醒:PHP是区别大小写的
4.mysql
-Mysql(小型关系型数据库管理系统)
a.体积小
b.速度快
c.成本低
d.开源
MYSQL默认使用的是3306端口
-存储引擎(存储表数据的类型)
a.MyISAM:较高的插入、查询速度,但不支持事务;默认。
b.InnoDB:支持事务
-phpMyAdmin(Web方式访问Mysql)
-类型小解
精度:指数值数据中所存储的十进制数据的总位数。
长度:指存储数据所使用的字节数
int
1.整数型
2.精度10
3.数值范围(-2147483648~2147483648)
4.长度4
注意:
int(n)
1.指定整数值的显示宽度
2.实际的宽度小于指定列宽度时,从左侧填满宽度
3.不改变长度,不改变数值范围
字符型
char/varchar(n) //n表示长度
当列中字符数据值长度一致时,使用char,长度不同时,使用varchar可以节省存储空间
-基本sql语句
a.SELECT 字段 FROM 表 WHERE 条件
b.INSERT INTO 表(字段)VALUES(值)
c.UPDATE 表 SET 更新内容 WHERE 条件
d.DELETE FROM 表 WHERE 条件
多练习是关键
查询语句之后:
1.分组:group by
2.排序:order by ASC/DESC
3.限制:limit O,N
对于limit来说,O为偏移量,跟数组一样是从0开始算起,N为数量
如:limit 1,5 相当于从第二条开始往后5条记录
5.php操作mysql
-基本步骤:
mysql_connect("hostname","username","password") //连接MYSQL
mysql_select_db("database_name"); //打开数据库
mysql_query($sql); //执行sql语句
mysql_fetch_array($result) //取值
mysql_query:
1.sql=select 时,执行成功返回一个资源标识符,执行错误返回FALSE
注意:查询成功不代表一定有结果,只说明语句正确
2.sql=insert/update时,执行成功返回TRUE,执行错误返回FALSE
mysql_fetch_array()
1.取得query(sql)的结果集中的一行保存到数组
2.依次调用将返回结果集中的下一行
3.可以通过字段名作索引
-中文编码
避免乱码:
1.建立数据库时,要选择相应的字符集。全国通用:GBK/gb2312;世界通用:UTF-8(建议选用)。
2.连接mysql时,加入连接字符集 "set names GBK";
注意:如果你set names UTF8,那么就应该设置页面编码为UTF-8
代码如下 | 复制代码 |
///////////////封装Php连接Mysql函数//////////////// function PHPConnectMysql($hostname,$username,$password,$database,$charaset){ mysql_connect($hostname,$username,$password); mysql_select_db($database); mysql_query("set names $charaset"); } |
小结:平时多积累,将特定功能函数化,以便重复利用
相关文章
- eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07- Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
- 分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
SQL Server中row_number函数的常见用法示例详解
这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21- 下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25