最近需要使用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: }
- 我们自己的异常类继承Exception后,就能当成异常来使用了,能够throw了
- PHP自身产生的错误总是按照PHP4的方式来报告,而不是报告异常,所以我们可以用自己函数来替换PHP的异常处理函数,不过替换后,记得要换回来,免得影响其他模块的正常工作。
- 在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方面很菜,所以看法也就有很多不对的地方。希望大家不要拍砖呀。感激。