1. 类中的方法不是全局方法,可以和外部的普通方法重名,例如:

<?php
function time();

则会报错:不能重新声明方法

Fatal error: Cannot redeclare time()

而在类中定义则可以:

<?php
class clock{
public function time(){
echo date('Y-m-d H:i:s');
}
} $c = new clock();
$c -> time();

页面输出:

2015-02-28 16:47:36

===============

2.析构函数

<?php
class Human{
public function __construct(){
echo 'hello<br />';
} public function __destruct(){
echo 'bye';
}
} $a = new Human();
//此时会输出'hello'和'bye'
//因为php是脚本语言,在代码执行到最后一行时,所有申请的内存都要被释放。
//自然,对象也要被销毁

$a 并不是对象,只是一个变量名指向对象。当一个对象如果还有其他变量来引用,unset($a)并不会销毁对象。当引用为0时,对象才会被销毁。

==========

3.父类的 private 属性可以被子类继承,但是子类无权操作

<?php 

class Human{
private $name = 'monkey';
} class Stu extends Human{
private $name = 'student';
} $john = new Stu();
var_dump($john);

页面输出:

object(Stu)[1]
private 'name' => string 'student' (length=7)
private 'name' (Human) => string 'monkey' (length=6)

=======

4.名词:里氏代换 - 面向对象设计的基本原则之一,任何基类可以出现的地方,子类一定可以出现。

多态 - 只抽象地声明父类,具体工作由子类对象完成。简单例子

<?php
class Light{
public function turnOn(Glass $g){ //类名 作 参数类型检测(php5.3)
$g->setUp();
}
} class Glass{
public $color;
public function setUp(){
echo '装上',$this->color,'色的玻璃<br />';
}
} class RedGlass extends Glass{
public $color = '红';
} class BlueGlass extends Glass{
public $color = '篮';
} $light = new Light(); $redglass = new RedGlass();
$blueglass = new BlueGlass(); $light->turnOn($redglass);
$light->turnOn($blueglass);

页面输出:

装上红色的玻璃
装上篮色的玻璃

=======

5. 魔术方法 ( __get(),__set(),__isset(),__unset() ) 在框架中的应用

<?php
class UserModel{
//存放传递的值
protected $data = array(); //获取
public function __get($p){
if(isset($this->data[$p])){
return $this->data[$p];
}
} //设置
public function __set($p,$v){
$this->data[$p] = $v;
return $this->data;
} //销毁
public function __unset($p){
if(isset($this->data[$p])){
unset($this->data[$p]);
}
} //isset判断
public function __isset($p){
return isset($this->data[$p]);
} public function add(){
//取出$data里存放的数值,键作为数据表的字段名,值作为数据表的字段值
$k = implode(',',array_keys($this->data));
$v = implode('\',\'',array_values($this->data));
//拼接字符串
$sql = 'insert into Review (';
$sql .= $k;
$sql .= ') values (\'';
$sql .= $v;
$sql .= '\')'; return $sql;
}
} $new = new UserModel();
$new->username = 'uname';
$new->password = 'upwd';
var_dump($new); var_dump($new->email); //显示 null echo $new->add(),'<br />'; unset($new->password);
var_dump($new);

页面输出:

object(UserModel)[1]
protected 'data' =>
array
'username' => string 'uname' (length=5)
'password' => string 'upwd' (length=4)
null
insert into Review (username,password) values ('uname','upwd')
object(UserModel)[1]
protected 'data' =>
array
'username' => string 'uname' (length=5)

=================

7.抽象类

① 抽象类的抽象方法不能有方法体,否则报错:Fatal error: Abstract function Classname::functionname() cannot contain body in ...

② 抽象类不能被实例化,否则报错:Fatal error: Cannot instantiate abstract class Classname in...

③ 继承抽象类的子类必须实现抽象类中的所有抽象方法,后则报错:Fatal error: Class SonClassname contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClassname ::Abstractfunctionname) in ...

④ 含有抽象方法的类一定是抽象类;

⑤ 抽象类中不一定有抽象方法,也可以含有非抽象方法。

<?php
//抽象类 无法实例化
abstract class FlyIdea{ //抽象方法,不能有方法体
public abstract function engine();
public abstract function blance();
} //抽象类
abstract class Rocket extends FlyIdea{
public function engine(){
echo 'half completed';
}
} //如果继承的类不是抽象类,则它的父类中的抽象方法必须全部实现
class ModenFly extends Rocket{
public function engine(){
echo 'engine completed';
} public function blance(){
echo 'blance completed';
}
} $apache = new ModenFly();

==================

8.延迟绑定:

是指类的计算 self 的定义不是以定义时为准,而是以运算时的计算结果为准。

<?php
//动物类
class Animal{
const age = 1;
public static $leg = 4; public static function eat(){
echo 'fresh food <br />';
} public static function t1(){
self::eat();
echo self::age,'<br />';
echo self::$leg,'<br />';
} //延迟绑定
public static function t2(){
static::eat();
echo static::age,'<br />';
echo static::$leg,'<br />';
}
} //人类
class Human extends Animal{
const age = 30;
public static $leg = 2; public static function eat(){
echo 'cooked food <br />';
}
} //学生类
class Stu extends Human{
const age = 20;
public static $leg = 3; public static function eat(){
echo 'rubbish food <br />';
}
} Stu::t1();
Stu::t2(); //后期绑定(运行期绑定)

页面输出:

fresh food 
1
4
rubbish food 
20
3

==================

9.接口

如果说类是一种事物的抽象,那么接口则是事物的功能的抽象。

接口比抽象类更为抽象,接口中不能含有非抽象方法,不能含有成员属性。接口中可以定义常量。

一个类可以同时实现多个接口,同时必须实现接口中所有的抽象方法。

不能实例化接口。

类实现接口使用 implements。接口继承接口使用 extends 。

<?php
//接口1
interface animal{
//接口中的抽象方法
public function eat();
}
//接口2 继承 接口1
interface lion extends animal{
public function run();
}
//接口3 继承 接口1
interface wisdom extends animal{
public function think();
public function emotion();
}
//一个类同时继承2个接口
class Human implements lion,wisdom{
//必须实现2个接口中所有的抽象方法(包括继承接口的父接口)
public function eat(){
echo '吃';
} public function run(){
echo '跑';
} public function think(){
echo '想';
} public function emotion(){
echo '情绪';
}
}

======================

10.类的自动加载

<?php

function __autoload($c){
require './'.$c.'Model.php';
} $Mary = new Human;
$Mary->say();

=======================

11.异常

在类中如果产生了错误,实例化该类依然会生成对象。使用了异常处理之后就可以针对对象进行错误检测。

<?php
//生产环境关闭错误信息
error_reporting(0);
class Db{
private $conn;
public function __construct(){
$this->conn = mysql_connect('localhost','root','111');
//异常处理
if(!$this->conn){
//实例化exception类,并传递错误信息和错误码参数
$e = new Exception('数据库连接失败!!',9);
//抛出异常
throw $e;
}
}
} //测试并试图捕捉异常
try{
$mysql = new Db();
}catch(Exception $e){
echo '捕捉到错误信息:';
echo $e->getMessage(),'<br />';
echo '捕捉到的错误码:';
echo $e->getCode(),'<br />';
echo '错误文件:',$e->getFile(),'<br />';
echo '错误行:',$e->getLine(),'<br />';
} var_dump($mysql);

如果数据库的信息填写错误,比如密码错误,页面输出:

捕捉到错误信息:数据库连接失败!!
捕捉到的错误码:9
错误文件:D:\practise\php\OOP\exception.php
错误行:11
null

PHP OO 编程笔记的更多相关文章

  1. python核心编程--笔记

    python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找pyt ...

  2. C# 高效编程笔记2

    C# 高效编程笔记2 1.理解GetHashCode()的陷阱 (1)作用:作为基于散列集合定义键的散列值,如:HashSet<T>,Dictionary<K,V>容器等 (2 ...

  3. C# 高效编程笔记1

    C# 高效编程笔记1 1.使用属性而不是可访问的数据成员 (1).NET Framework中的数据绑定类仅支持属性,而不支持共有数据成员 (2)属性相比数据成员更容易修改 2.用运行时常量(read ...

  4. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

  5. storysnail的Windows串口编程笔记

    storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...

  6. DSP28377S - ADC学习编程笔记

    DSP28377S -  ADC学习编程笔记 彭会锋 2016-08-04  20:19:52 1 ADC类型导致的配置区别 F28377S的ADC类型是Type 4类型,我的理解是不同类型的ADC采 ...

  7. C# Socket编程笔记(转)

    C# Socket编程笔记 http://www.cnblogs.com/stg609/archive/2008/11/15/1333889.html TCP Socket:Server 端连接步骤: ...

  8. RX编程笔记——JavaScript 获取地理位置

    RX编程笔记——JavaScript 获取地理位置 2016-07-05

  9. Shell编程笔记

    Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理.   修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...

随机推荐

  1. 10.组合模式(Composite Pattern)

    using System; using System.Collections.Generic; namespace ConsoleApplication8 { class Program { stat ...

  2. MQ的通讯模式

    1) 点对点通讯:点对点方式是最为传统和常见的通讯方式,它支持一对一.一对多.多对多.多对一等多种配置方式,支持树状.网状等多种拓扑结构. 2) 多点广播:MQ适用于不同类型的应用.其中重要的,也是正 ...

  3. ML 01、机器学习概论

    机器学习原理.实现与实践——机器学习概论 如果一个系统能够通过执行某个过程改进它的性能,这就是学习. ——— Herbert A. Simon 1. 机器学习是什么 计算机基于数据来构建概率统计模型并 ...

  4. chrome扩展程序开发之在目标页面运行自己的JS

    大家都知道JS是运行在客户端的,所以,如果我们自己写一个浏览器的话,是一定可以往下载下来的网页源代码中加入js的.可惜我们没有这个能力.不过幸运的是,chrome的扩展程序可以帮我们做到这件事. 本文 ...

  5. 水题 ZOJ 3875 Lunch Time

    题目传送门 /* 水题:找排序找中间的价格,若有两个,选价格大的: 写的是有点搓:) */ #include <cstdio> #include <iostream> #inc ...

  6. HDU 1180 (BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...

  7. 密码等级:至少包含字母、大小写数字、字符中的两种 JS实现方案

    前言 密码,如果设置的太简单,很容易就被攻破,所以很多网站将密码设置的要求设置的挺严格,一般是字母.数字.字符3选2,区分大小写.对于设置得太简单的密码,予以错误提示.或者予以密码等级(低中高)显示, ...

  8. svg―Raphael.js Library

    Raphael是一个用于在网页中绘制矢量图形的Javascript库,它使用SVG W3C推荐标准和VML作为创建图形的基础,可以通过JavaScript操作DOM来轻松创建出各种复杂的柱状图.饼图. ...

  9. ashx 集成于Ihandle 简易 高性能 web

    不用搞MV4..如果你用.ashx写的后台..自己加一个switch case就实现了路由...更方便,还不用配置   scaffold 不是dynamic data里面的东西吗   现在我全是ash ...

  10. python模块之codecs

    http://blog.csdn.net/suofiya2008/article/details/5579413