PHP - 简单学习过程1

最近需要使用PHP,所以我也只能把书拿出来看看,书是图灵的《PHP实战》,人民邮电出版的。

PHP中如何使用类

   1: <?php
   2:     class Document{
   3:         protected $title;
   4:         private $text;
   5:         function __construct($title, $text) {
   6:             $this->title = $title;
   7:             $this->text = $text;
   8:         }
   9:     }
  10:     class NewArticle extends Document{
  11:         public $introduction;
  12:         function __construct($title, $text, $introduction) {
  13:             parent::__construct($title, $text);
  14:             $this->introduction = $introduction;
  15:         }
  16:     }
  17: ?>
从上面的代码,我们可以看出来:
  • PHP代码是动态的,无类型
  • 代码嵌入到<?php ?>标签中,或者简化的<? ?>标签中
  • 变量必须以$开头,如$this
  • PHP中默认可见性都是public,因为是动态语言,为了动态都可见了,哈哈
  • 其他的都和C++类似。

异常的处理

请看下面的代码:

   1: if(!array_key_exists('DBNAME', $_ENV))
   2:             die('环境变量中没有DBNAME');
   3:     
   4:     if(!array_key_exists('DBNAME', $_ENV))
   5:             throw new Exception('环境变量中没有DBNAME');

上面两段代码的区别:
1. 如果没有DBNAME,在输出窗口输出“环境变量中没有DBNAME”,然后程序退出
2. 如果调用程序没有用try处理,那么效果同上,如果调用程序用了try处理,那么程序会继续运行,并在堆栈中记录下相关信息,我们可以调用debug_backtrace()和debug_print_backtrace()来输出和处理堆栈中的信息
3. 当die()或者throw代码行被触发后,它们后面的所有代码都不会再被执行。

自定义异常和捕获异常


代码如下:
   1: class ErrorFromPHPException extends Exception{
   2:         function PHPErrorHandler($errno, $errstr, $errfile, $errline){
   3:             throw new ErrorFromPHPException($errstr, $errno);
   4:         }
   5:         
   6:         function ChangeErrorHandler(){//替换系统自己的错误处理函数,类似API HOOK技术
   7:             $oldhandler = set_error_handler('PHPErrorHandler');//用我们自己的函数来替换原来的函数
   8:             //如果现在需要替换回来的话
   9:             set_error_handler($oldhandler);
  10:         }
  11:     }
  12:     try{
  13:     //执行一些操作,可能会产生异常
  14:     }  catch (ErrorFromPHPException $e){//如果异常是我们定义的异常,那么执行对应的异常处理操作
  15:         //操作1
  16:     }  catch (Exception $e){ //由于任何异常都继承自Exception,所以这里就能截获所有的异常
  17:         //操作2
  18:     }
上面的代码能看出来:
  1. 我们自己的异常类继承Exception后,就能当成异常来使用了,能够throw了
  2. PHP自身产生的错误总是按照PHP4的方式来报告,而不是报告异常,所以我们可以用自己函数来替换PHP的异常处理函数,不过替换后,记得要换回来,免得影响其他模块的正常工作。
  3. 在try..catch..处理中,catch的顺序一定要对,如果catch(Exception $e)放在其他catch语句前面,那么其他catch语句都不会被执行了,切记

方法的重写(override):子类的方法和父类完全一样,而且子类重新实现了此方法,那么这个子类就重写了这个方法.
方法的重载(overload):如果一个类中多个方法的名字一样,但是参数不一样(个数或者类型),那么这几个方法就是相互重载.

看看魔法函数__get()和__set()


代码如下:

   1: class Properties{
   2:     private $text;
   3:     
   4:     private function __get($name) {
   5:         $method = 'get'.$name;
   6:         return $this->$method();
   7:     }
   8:     
   9:     private function __set($name, $value) {
  10:         $method = 'set'.$name;
  11:         return $this->$method($value);
  12:     }
  13:     
  14:     public function getText() {
  15:         return $this->text;
  16:     }
  17:  
  18:     public function setText($text) {
  19:         $this->text = $text;
  20:     }
  21: }

我们重写Magic函数__get和__set,那么在访问$text时候,函数调用顺序:先调用__get(‘Text’)再调用getText()。因此我们可以重写__get和__set方法来拦截对变量的访问。如何?哈哈。

final修饰类,防止类被继承;修饰方法,防止方法被子类重写。常量用const来定义。


静态方法(类方法),静态变量都和C++一样。


类常量用const DBName = ‘HuangJacky’;就可以了不需要static修饰,常量一般不用$开头.


使用类变量而非常量.
使用方法而非常量.

抽象类和抽象方法,使用abstract修饰,声明和使用都和C++一样。

类型提示,虽然php的参数可以不用声明其类型,但是我们可以显示定义其类型,那么程序在调用的时候参数的类型就必须匹配。


以上都是我自己的看法,当然因为我PHP方面很菜,所以看法也就有很多不对的地方。希望大家不要拍砖呀。感激。
posted @ 2012-01-06 21:46  HuangJacky  阅读(846)  评论(0编辑  收藏  举报
AdminLogin