【PHP】PHP常用基础知识和学习资源

一、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,将为你讲解学软件学什么,软件可以做什么,创业中要注意那些问题等。   


你可能感兴趣的:(【PHP】PHP常用基础知识和学习资源)