一、PHP常用基础知识
1、PHP的魔法函数
-
__construct():实例化对象时被调用。
-
当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
-
如果父类中存在魔法函数和构造函数,子类又重写构造函数,则实例化子类时调用子类中的构造函数。
-
php4以前的版本中,类的构造函数即是类的同名函数,而到了php5类的构造函数多了一个__construct魔法函数 :
-
-
__destruct():当删除一个对象或对象操作终止时被调用。
-
__call():对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数。
-
__get():读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。
-
__set():设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数。
-
__toString() :打印一个对象的时被调用。如echo $obj;或print $obj;
-
function __toString() { return $this->content; } //输出字符串 function toString() { return $this->content; }
-
执行的结果相同. 区别在于:
-
前一个是魔术函数, 在需要字符串值的地方会自动调用它进行对象的类型转换.(如用 echo进行输出时、强制类型转换时)
-
后一个需要在代码中明确调用才有机会执行.
-
-
-
__clone():克隆对象时被调用。如:$t=new Test();$t1=clone $t;
-
__sleep():serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
-
__wakeup():unserialize时被调用,做些对象的初始化工作。
-
__isset():检测一个对象的属性是否存在时被调用。如:isset($c->name)。
-
__unset():unset一个对象的属性时被调用。如:unset($c->name)。
-
__set_state():调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
-
__autoload():实例化一个对象时,如果对应的类不存在,则该方法被调用。
2、PHP的魔法变量
-
__LINE__:返回文件中的当前行号。
-
__FILE__:返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
-
__FUNCTION__:返回函数名称(PHP4.3.0新加)。自PHP5起本常量返回该函数被定义时的名字(区分大小写)。在PHP4中该值总是小写字母的。
-
__CLASS__:返回类的名称(PHP4.3.0 新加)。自PHP5起本常量返回该类被定义时的名字(区分大小写)。在PHP4中该值总是小写字母的。
-
__METHOD__:返回类的方法名(PHP5.0.0新加)。返回该方法被定义时的名字(区分大小写)。
3、public 、protected、private
-
public 表示全局,类内部外部子类都可以访问;
-
protected表示受保护的,只有本类或子类或父类中可以访问;
-
private表示私有的,只有本类内部可以使用。
4、PHP中的操作符::、->、self、$this
-
操作符
-
静态变量:
-
静态变量是指用static声明的变量,这种变量与局部变量的区别是,当静态变量离开了它的作用范围后,它的值不会自动消亡,而是继续存在,当下次再用到它的时候,可以保留最近一次的值。
-
-
自定义常量:
-
所谓自定义常量,就是指用一个字符标识来代表另外一个对象,这个对象可以是一个数值,一个字符串,一个布尔值等等。它的定义与变量有着许多相似之处。只有一点不一样,那就是变量的值在程序运行过程中可以任意更改,而自定义常量一旦定义下来后,在程序运行中就再也不能修改了。
-
定义方式如下: define("YEAR","2012");
-
-
在类的外部访问:
-
(操作符:: )在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::
-
(操作符->) 如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->
-
-
在类的内部访问:
-
(操作符 self) 如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self
-
(操作符 $this) 如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this
-
-
-
说明
-
由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。
-
静态属性也可以由对象通过->操作符来访问。
-
用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。
-
就像其它所有的PHP静态变量一样,静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。
-
PHP5.3.0之后,我们可以用一个变量来动态调用类。但该变量的值不能为关键字self, parent 或static。
-
-
实例
-
<?php /* *author:ajax123 *qq:283400245 */ class person{ static $name="ajax123";//static声明静态属性 static $age=25;//static声明静态属性 static $address="北京";//static声明静态属性 function song(){ echo "My name is : ".self::$name."<br>";//类内部:通过通过self 类访问静态属性 echo "I am ".self::$age."<br>";//类内部:通过通过self 类访问静态属性 echo "I live in ".self::$address."<br>";//类内部:通过self 类访问静态属性 } } echo person::$name."<br>";//类外部:通过类名person访问静态属性 echo person::$age."<br>";//类外部:通过类名person访问静态属性 echo person::$address."<br>";//类外部:通过类名person访问静态属性 ?>
-
5、PHP中的流程替代语法:冒号、endif、endwhile、endfor
替代语法的基本形式:
左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;
这些语法能发挥的地方是在PHP和HTML混合页面的代码里面。好处如下:
1.使HTML和PHP混合页面代码更加干净整齐。
2.流程控制逻辑更清晰,代码更容易阅读
3.一些从ASP等其他类basic语言家族转来的朋友,会更容易使用PHP。
if语句的替代语法使用如下:
<?php if ($a == 5): ?>
<div>等于5</div>
<?php elseif ($a == 6): ?>
<div>等于5</div>
<?php else: ?>
<div>不是5就是6</div>
<?php endif; ?>
while替代语法:
<?php while (expr): ?>
<li>循环点什么</li>
<?php endwhile; ?>
for替代语法:
<?php for (expr1; expr2; expr3): ?>
<li>循环点什么</li>
<?php endfor; ?>
foreach替代语法:
<?php foreach (expr1): ?>
<li>循环点什么</li>
<?php endforeach; ?>
switch替代语法:
<?php
switch ($i):
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
endswitch;
?>
6、自动转义配置 magic_quotes_gpc 和 magic_quotes_runtime
PHP提供两个方便我们引用数据的魔法引用函数magic_quotes_gpc和magic_quotes_runtime,这两个函数如果在 php.ini设置为ON的时候,就会为我们引用的数据碰到单引号'和双引号"以及反斜线 \ 时自动加上反斜线,帮我们自动转译符号,确保数据操作的正确运行,可是我们在php不同的版本或者不同的服务器配置下,有的 magic_quotes_gpc和magic_quotes_runtime设置为on,有的又是off,所以我们写的程序必须符合on和off两种情况。
那么magic_quotes_gpc和magic_quotes_runtime两个函数有什么区别呢?看下面的说明:
-
magic_quotes_gpc
-
作用范围:WEB客户服务端;
-
作用时间:请求开始时,例如当脚本运行时.
-
-
magic_quotes_runtime
-
作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;
-
作用时间:每次当脚本访问运行状态中产生的数据.
-
所以 magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据;magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据。
例子说明:
<form action="" method="post" >
STR:<input type="text" name="str">
<input type="submit">
</form>
<?php
/* 我们在表单里填写: '"\ 这些符号,如果magic_quotes_gpc没有开启,那么他们不会被反斜杠转义 */
echo '现在通过POST传递过来的值是:' ,$_POST['str'], '<br />';
if (get_magic_quotes_gpc()) { // 检查magic_quotes_gpc是否打开,如果没有打开,用addslashes进行转义
$str = $_POST['str'];
} else {
$str = addslashes($_POST['str']);
}
echo '这里是转义过后的:' ,$str, '<hr />';
$sql = "INSERT INTO lastnames (lastname) VALUES ('$str')";
//=====================================================================================
//-----magic_quotes_gpc只会转义: 通过Get/Post/Cookies获得的数据
//-----magic_quotes_runtime会转义:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的
//=====================================================================================
$data = implode(file('try.php')); // 我们在里面依然写'"\这几个字符,用来测试
echo '这里是try.php的数据,';
if (get_magic_quotes_runtime()) {
$data = $data;
echo '被系统自带转义的' .$data;
} else {
echo '被addslashes转义了的' .$data = addslashes($data);
}
$sql = "INSERT INTO lastnames (lastname) VALUES ('$data')";
echo '<br />SQL语句为:<br />' ,$sql;
//---入库都转义了,但是多余了反斜杠,我们要读出来是原来的数据时候使用stripslashes()去掉反斜杠
//---stripslashes()和addslashes()作用相反
?>
最关键的区别是就是上面提到的2点:
-
他们针对的处理对象不同 magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据
-
magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据
在这里顺便在提几个想关联的函数:
-
set_magic_quotes_runtime():设置magic_quotes_runtime值. 0=关闭.1=打开.默认状态是关闭的.可以通过 echo phpinfo(); 查看
-
magic_quotes_runtimeget_magic_quotes_gpc():查看magic_quotes_gpc值.0=关闭.1=打开.get_magic_quotes_runtime():查看magic_quotes_runtime值。0=关闭.1=打开.注意的是没有 set_magic_quotes_gpc()这个函数,就是不能在程序里面设置magic_quotes_gpc的值。
7、“@” 的作用
如果连接数据库不成功的,前面的“@”就能把错误显示给抑制住,也就是不会显示错误,然后再抛出异常,显示自己定义的异常处理,添加这个只是为了让浏览者不看到,不友好的页面,并不能抑制住错误,只能抑制显示错误!@ 用在你觉得以后运行有可能会出现错误的地方 , @后面要来个空格!最好少用,好像增加系统开销.
二、学习资源列表
-
PHP加MySQL网站设计入门实践实战篇 :http://www.howzhi.com/course/PHPMYQL2/ 大量实例视频,文件上传、邮件、数据库、Orcale数据库操作、留言本(Mysql版和orcale版)、在线投票、论坛、聊天室、CMS、商城等。
-
MySQL数据库性能优化 :http://www.howzhi.com/course/mysql-performance/
从缓存参数、表结构、索引、SQL四方面讲解了MySQL数据库性能优化的一些常用方法,望对初中级 MySQL DBA以及其他对MySQL性能优化感兴趣的朋友们有所帮助
作者:简朝阳 ,数据库专家、《MySQL性能调优与架构设计》作者 -
NodeParty杭州站第二期系列讲座 :http://www.howzhi.com/course/nodejsparty2/
高性能node应用分析、node构建静态资源管理系统、Nodojs学些过程。 -
好知网讲座第一期《大流量网站架构》 :http://www.howzhi.com/course/dllwzjiagou/
Kent以自己曾经管理过的一个项目为例,讲解了在大型网站架构中所遇到的一些问题及解决方法
主讲师:Kent,10余年行业经验,曾任职19楼架构师和某公司CTO。 -
WEB运维安全 已发布 :http://www.howzhi.com/course/websafty/
高并发下网站的优调,WEB应用安全防护,如何成为优秀的运维架构师。演讲嘉宾:倪顺坚,阿里巴巴资深架构师;邵海杨,53KF科技技术顾问;dreamice, ChinaUnie资深版主。 -
哈弗大学《构架动态网站》 :http://www.howzhi.com/course/dynamicweb/
哈弗的E-75课程,讲解HTTP、PHP,SQL,JAVASCRIP、Ajax等知识。英文的哦,有点考英语水平,不过有翻译。 -
步入软件人生 :http://www.howzhi.com/course/zjrjrs/
拥有十几年软件开发和敏捷管理经验的Kent,将为你讲解学软件学什么,软件可以做什么,创业中要注意那些问题等。