PHP中动态特性学习笔记(1/3)
本文主要总结给对PHP 特性不了解的新手看的,因此演示代码占比较多的篇幅。
大家看还缺哪些给补充吧。欢迎来邮件或在PHPChina 的《PHPer》杂志版块纠正错误。
动态语言就是能够在运行时改变程序结构和变量类型的语言。例如:新的类和对
象可以被加载和创建,新的函数或方法可以加入和去除等等,比如Smalltalk、Ruby、
Python、PHP、Lua、Perl、Groovy 等。反之则是静态语言,比如C/C++、Java、C#等。
动态语言的动态特性决定它开发的时候需要更少的代码,有更高的灵活性。PHP
的动态特性奠定了它存在的价值,熟悉PHP 的动态特性让我们更能活用PHP。
1 弱类型变量
动态语言都被设计成弱类型,也就是说变量被赋值以后才能确定它的数据类型,
当代码在实际执行时,才会检测变量是否被非法使用。
PHP 变量是弱类型变量就意味着,我们不需要声明变量的类型,在运行时自动检
测变量的类型,并且可以认为改动变量的类型。
2、PHP动态特性:
特性1、弱类型变量
PHP变量是弱类型变量就意味着,我们不需要声明变量的类型,在运行时自动检测变量的类型,并且可以认为改动变量的类型。
代码如下 | 复制代码 |
// PHP弱类型变量例子 $test = 1; print gettype($test) . ": $testn"; $test = 1.23456789; print gettype($test) . ": $testn"; $test = 'test'; // 变量自动改变类型 print gettype($test) . ": $testn"; $test = array('t'=>'HI,I m from an array!'); settype($test, 'object'); // 改变变量的类型 print gettype($test) . ": {$test->t}n"; // 测试变量类型 if(is_object($test)) { print "Test Type: My Type Is object.n"; } else { print gettype($test); } |
弱类型并不意味着代码不安全,或者不健壮。极限编程已经给成为一种软件开发方法。这个方法侧重测试,使用全面的单元测试方案来驱动开发过程。通过不同环境
下执行所编写的代码,就可以保证代码的安全性和健壮性。经验证明,在弱类型语言中,综合运用弱类型和单元测试通常比传统系统编程语言的类型检查更好(请参
特性2、可变变量
一个变量的变量名可以动态的设置和使用
代码如下 | 复制代码 |
// 可变变量例子 $var = 'hi'; $$var = 'hello'; print $var; print $$var; print $hi; // 等价于上一行 |
特性3、变量函数
这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且将尝试执行它。除了别的事情以外,这个可以被用于实现回调函数,函数表等等。
代码如下 | 复制代码 |
// 变量函数例子 // 无参数函数 function a(){ print "i'm an"; } // 有参数函数 function b($param) { print "i'm b, param: $paramn"; } $x = 'a'; $x(); $x = 'b'; $x('xxxxxxxxxxx'); |
特性4、可变长度参数列表
调用函数的时候,函数的参数个数可以不一样
代码如下 | 复制代码 |
function foo() { $numargs = func_num_args(); print "Number of arguments: $numargsn"; print "the third argument: " . func_get_arg(2) . "n"; } foo(1, 2, '...@...'); foo(1, 2, '############', 4); |
php date()是一个获取时间日期的函数但你对于php date()函数了解多少呢,下面本文章就介绍的介绍日期函数在开发中一些常用的格式与例子吧。
PHP可以通过date() 函数来显示服务器日期和时间,下面详细了解一下如何使用date()函数来输出日期:
php date() 函数详解
1,年-月-日
代码如下 | 复制代码 |
echo date('Y-m-j');
|
大写Y表示年四位数字,而小写y表示年的两位数字;
小写m表示月份的数字(带前导),而小写n则表示不带前导的月份数字。
代码如下 | 复制代码 |
|
大写M表示月份的3个缩写字符,而小写m则表示月份的数字(带前导0);
没有大写的J,只有小写j表示月份的日期,无前导o;若需要月份带前导则使用小写d。
代码如下 | 复制代码 |
|
大写M表示月份的3个缩写字符,而大写F表示月份的英文全写。(没有小写f)
大写S表示日期的后缀,比如“st”、“nd”、“rd”和“th”,具体看日期数字为何。
小结:
表示年可以用大写的Y和小写y;
表示月可以用大写F、大写M、小写m和小写n(分别表示字符和数字的两种方式);
表示日可以用小写d和小写j,大写S表示日期的后缀。
2,时:分:秒
默认情况下,PHP解释显示的时间为“格林威治标准时间”,与我们本地的时间相差8个小时。
代码如下 | 复制代码 |
echo date('h:i:s A'); |
小写g表示12小时制,无前导0,而小写h则表示有前导0的12小时制。
当使用12小时制时需要表明上下午,小写a表示小写的“am”和“pm”,大写A表示大写的“AM”和“PM”。
代码如下 | 复制代码 |
echo date('G:i:s'); |
大写G表示24小时制的小时数,但是不带前导的;使用大写的H表示带前导的24小时制小时数
小结:
字母g表示小时不带前导,字母h表示小时带前导;
小写g、h表示12小时制,大写G、H表示24小时制。
3,闰年、星期、天
代码如下 | 复制代码 |
echo date('L');
echo date('D'); |
大写L表示判断今年是否闰年,布尔值,为真返回1,否则为0;
小写l表示当天是星期几的英文全写(Tuesday);
而使用大写D表示星期几的3个字符缩写(Tue)。
代码如下 | 复制代码 |
echo date('w'); echo date('W'); 小写w表示星期几,数字形式表示 echo date('t'); echo date('z'); |
小写t表示当前月份又多少天
小写z表示今天是本年中第几天
4,其他
代码如下 | 复制代码 |
|
date函数中时区问题
date("Y-m-d h:i:s") 总和服务器时间相差几个小时
解决方法如下:
一、在页头使用date_default_timezone_set()设置我的默认时区为北京时间
代码如下 | 复制代码 |
date_default_timezone_set('PRC'); echo date('Y-m-d H:i:s'); |
时间和服务器当前时间一样了!!
二、修改php.ini。
打开php5.ini查找date.timezone 去掉前面的分号 = 后面加XXX,重启http服务
(如apache2或iis等)即可。
关于XXX,大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,
Asia/Urumqi (依次为重庆,上海,乌鲁木齐)港台地区可用:Asia/Macao ,
Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北)还有新加坡:
Asia/Singapore老外好像把北京漏调了其他可用的值是:Etc/GMT-8 ,Singapore ,
Hongkong ,PRC,PRC是什么?PRC是中华人民共和国啊-_-以上都是从php官方说明档里
整理出来的GMT+8下面的地区,可能会有遗漏。
date函数月和日带0问题
代码如下 | 复制代码 |
一、带零 echo date('Y-m-d'); 二、不带零 echo date('Y-n-j'); |
我的程序
代码如下 | 复制代码 |
echo $fileddata['house_feature']; echo '----'.$fileddata['house_feature'] |
结果为:南北通透|||随时看房|||交通便利 --------
后来反复查没查出原因,百度搜索了一下有一个网友这样说implode(',',$goods_attr) 这个写的一点都不科学。应该做判断.if($goods_attr) 这一下想了,这个implode不是只能是把数组转换成字符吗?百度一下mplode() 函数把数组元素组合为一个字符串。
参数 | 描述 |
---|---|
separator | 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。 |
array | 必需。要结合为字符串的数组。 |
后面没有值呀,后来
代码如下 | 复制代码 |
$fileddata['house_feature'] = str_replace('|||',',',$fileddata['house_feature']); |
再测试 南北通透|||随时看房|||交通便利南北通透,随时看房,交通便利 就是我想要的结果了。
下面来给大家介绍一个可能大家都常用模糊的php中Null 空 与0值区别分析,下面举了几个例子,大家仔细的看看吧。
例子。
代码如下 | 复制代码 |
<?php |
从上面看得出来当为空时就与0或null是相等了,但如果是精确比较时我们会发现0与空或null是以字符对比了这样就不会了,如果是普通对比他就是逻辑假来对比了,从这里我们可以看出0==false,null=false,''==false哦。
php5中魔术方法有9个哦,下面我给大家整理了魔术方法9个的使用与简单的应用例子,如果你有兴趣不防进入参考吧,希望文章对各位同学会带来帮助哦。
1.__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。
代码如下 | 复制代码 |
class Test { function __construct() { echo "before"; } } $t = new Test(); class Test { function __construct() { echo "before"; } } $t = new Test(); |
输出是:
start
构造器是一个魔术方法,当对象被实例化时它会被调用。在一个类声明时它常常是第一件做的事但是没得必要他也像其他任何方法在类中任何地方都可以声明,构造器也能像其他方法样继承。如果我们想到以前继承例子从介绍到oop,我们能添加构造方法到Animal 类中
1
代码如下 | 复制代码 |
class Animal{ public function __construct() { $this->created = time(); $this->logfile_handle = fopen('/tmp/log.txt', 'w'); } } |
现在我们创建一个类来继承Animal类 - Penguin类!不添加任何属性和方法在Penguin类中,我们能申明并定义它继承自
代码如下 | 复制代码 |
Animal类,如: $tux = new Penguin; |
我们知道php5对象模型 和类名相同的函数是类的构造函数,那么如果我们同时定义构造函数和__construct()方法的话,php5会默认调用构造函数而不会调用__construct()函数,所以__construct()作为类的默认的构造函数
2.__destruct() 当删除一个对象或对象操作终止的时候,调用该方法。
Java代码
代码如下 | 复制代码 |
class Test { function __destruct() { echo "end"; } } $t = new Test();将会输出end class Test { function __destruct() { echo "end"; } } $t = new Test();将会输出end |
我们就可以在对象操作结束的时候进行释放资源之类的操作
3.__get() 当试图读取一个并不存在的属性的时候被调用。
如果试图读取一个对象并不存在的属性的时候,PHP就会给出错误信息。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中反射的各种操作。
代码如下 | 复制代码 |
class Test { public function __get($key) { echo $key . " 不存在"; } } $t = new Test(); echo $t->name; 就会输出:name 不存在 class Test { public function __get($key) { echo $key . " 不存在"; } } $t = new Test(); echo $t->name; 就会输出:name 不存在 |
例子
代码如下 | 复制代码 |
class Penguin extends Animal { public function __construct($id) { $this->getPenguinFromDb($id); } public function getPenguinFromDb($id) { } } |
4.__set() 当试图向一个并不存在的属性写入值的时候被调用。
代码如下 | 复制代码 |
class Test { public function __set($key,$value) { echo '对'.$key . "附值".$value; } } $t = new Test(); $t->name = "aninggo"; 就会输出:对 name 附值 aninggo |
5.__call() 当试图调用一个对象并不存在的方法时,调用该方法。
代码如下 | 复制代码 |
|
6.__toString() 当打印一个对象的时候被调用
这个方法类似于java的toString方法,当我们直接打印对象的时候回调用这个函数
代码如下 | 复制代码 |
public function __construct($name) { $this->species = 'Penguin'; $this->name = $name; }
public function __toString() { return $this->name . " (" . $this->species . ")n"; } } |
在适当的位置,输出该对象通过调用echo输出它,如:
代码如下 | 复制代码 |
$tux = new Penguin('tux'); echo $tux; |
7.__clone()
我们看过一个使用clone关键字的例子,在我的介绍从入门到oop的第二部分,创建对象的副本,而不是有两个变量指向同一个实际的数据。在一个类中重写此方法,我们可以观察发生了什么当在对象上使用clone关键字时,。虽然这是不是我们每一天能遇到的,一个漂亮的用例是创建一个真正的单例模式通过添加private访问修饰符给这个方法。
代码如下 | 复制代码 |
class Test { public function __clone() { echo "我被复制了!"; } }$t = new Test(); $t1 = clone $t;程序输出:我被克隆了! |
__sleep
__sleep()方法会被调用当对象被序列化后,并允许你处理序列化。这有各种各样的程序,一个很好的例子如果一个对象包含某种类型的指针,例如文件句柄或引用另一个对象。当对象被序列化然后解序列化,这些引用类型是无用的,因为这些类型的引用的目标可能不再存在或有效。因此,最好是来取消这些信息在存储它们之前。
__wakeup
__wakeup()是与__sleep()方法相反的,允许您更改对象解序列化的行为。和__sleep()一起使用,可以用来恢复被删除的句柄和对象当对象被序列化时。一个很好的例子程序是数据库句柄被取消设置当该项被序列化,然后恢复到当前配置中设置项目时,解序列化一个数据库句柄。
__autoload()方法可
比如我们将上面的那个Person类所在的文件定义为 Person_class.php ,
再新建一个php文件 test.php,编辑内容:
代码如下 | 复制代码 |
function __autoload($calssName) { include $className.”_class.php”; //看到这也许你就明白了吧?哈哈 } $p = new Person(“mifan”, 22); $p->say(); |
这样执行该test.php页面就不会出现错误了。
php魔术方法一般在什么情况下需要使用
举个简单的例子,当类里面没有属性$name; 但是你不小心访问这个属性,这个时候就会出错。但是让你可以设置魔术方法__get($name){ return $name . "不存在"};就会自动调用__get($name);这样程序就会不因为你访问了一个不存在的属性报错而中断执行
补充下 __get($v) 访问未定义的属性时调用,
__set($v) ?未定义的属性赋值时调用,
__isset($v)对未定义的属性使用isset()函数时调用,
__unset($v)和isset($v)类似
__call($method)访问未定义的方法是被调用
相关文章
- ps动态环绕动画效果是现在很多人都非常喜欢的,大多数人还不知道ps动态环绕动画效果怎么制作下面文章就给大家介绍下ps怎么制作科技感十足的动态环绕动画效果,一起来看看...2017-07-06
- 这篇文章主要介绍了vue 实现动态路由的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-06
- 今天我们来给大家介绍下在Vue开发中我们经常会碰到的一种需求场景,本文主要介绍了Vue动态查询规则生成组件,需要的朋友们下面随着小编来一起学习学习吧...2021-05-27
- 这篇文章介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下...2020-06-25
- 本文详细讲解了SQLServer中执行动态SQL的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2022-05-19
- 想在网页中动态地显示当前系统的时间,找了好多,不过都是一些停在那里不动的。。。不过皇天不负有心人,终于让我找到了...2020-06-25
- 下面小编就为大家带来一篇jQuery为动态生成的select元素添加事件的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-09-01
- 最近由于项目的需要,需要动态的添加和删除table中的tr,感觉用JS可以实现,但是在网上找了一下,单纯的自己写JS,感觉太麻烦,而且也不好维护。于是想到了最近学的jQuery。这篇文章给大家用实例介绍了jQuery动态添加与删除tr行的方法,有需要的朋友们可以参考借鉴。...2016-10-20
- 我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
- 1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
- 这篇文章主要介绍了C#实现动态显示及动态移除图片方法,对于C#的初学者了解图像操作有一定的帮助,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇用C++面向对象的方式动态加载so的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
- 当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
- 本篇文章主要介绍了vue2 中如何实现动态表单增删改查实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...2017-06-15
- 这篇文章主要介绍了Springboot使用thymeleaf动态模板实现刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-31
- 举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
- 这篇文章主要介绍了C#中事件的动态调用实现方法,对比传统思路优劣给出了一个新的解决方案,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Treegrid的动态加载实例代码的相关资料,需要的朋友可以参考下...2016-05-04
- 这篇文章主要给大家介绍了关于vue动态设置页面title的相关资料,文中通过实例代码结束的非常详细,对大家学习或者使用Vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-08-24
- 这篇文章主要介绍了jquery及js实现动态加载js文件的方法,结合实例形式分别讲述了基于jQuery以及基于JavaScript的文件动态加载方法,需要的朋友可以参考下...2016-01-24