重拾PHP--面向过程编程与基于对象编程

  关于PHP面向过程编程的好处,一个说法是:PHP是一个解释性的语言——这意味着,不像那些编译型的语言,PHP它不会被编译成一个可执行的包,而是被解释并马上执行。PHP被称为是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言。仔细想想也不难理解,因为解析Web页面本身就非常的“过程化”(从一个标签到另一个标签),所以在HTML中嵌入过程化的处理代码是很直接自然的作法。  

  关于面向对象的编程(oop),不同的人可能会有不同的解释,但应该都离不了它的三大特性:封装、继承、多态。

  其中,实现多态有两种方式:覆盖、重载。(PHP貌似不支持重载?)

  在许多编程语言中,“面向对象” 与 “面向过程” 只能使用二者之一来进行编程,但是PHP语言与其他编程语言有不同之处,那就是我们可以自由的选择或者将PHP面向对象和PHP面向过程二者混用 。

  面向过程风格:

<?php echo "翔宇后生!";  ?> 

  面向对象风格:

<?php 

//父类 class Myclass { public $name="我是翔宇后生!";

public static $count = 0;

//构造函数
public function __construct()
{
echo '类"',__CLASS__,'"已被初始化!<br />';
}

//析构函数
public function __destruct()
{
echo '类"',__CLASS__,'"已被释放!<br />';
} public function setProperty($new) { $this->name=$new; } public function getProperty() { return $this->name. "<br />"; }

public static function plusOne()
{
return "当前数字是".++self::$count."<br/>";
} }


//类继承
class MySonClass extends MyClass

{
public function newMenthod()
{
echo "来自类".__CLASS__."的新方法<br />";
}
}
//创建一个对象 $obj=new Myclass;

//获取属性$name的值 echo $obj->name;
//销毁这个对象(显式触发析构行为)
unset($obj);

//创建一个新的对象
$newObj = new MySonClass;
//调用子类新对象的一个方法
echo $newObj->newMenthod;
//调用父类的一个方法
echo $newObj->getProperty();

do{
//不生成MyClass实例,直接调用plusOne()方法
echo MyClass::plusOne();
}while(MyClass::$count < 10)

//在文件末尾输出一条消息
echo "文件结束。<br />";
?>

  注意:类中的方法,就是属于某一个类的函数,一个类定义多少个方法就决定它的实例能有多少种行为。上面的类,就是创建了两个方法来设置和读取这个类的属性$name。PHP中,在类内,使用$this引用对象自己。在类内引用一个方法也同样使用$this,在类外引用对象则要使用对象名。箭头(->)是访问特定对象包含的属性或方法的一个面向对象构造(其实就是一个引用运算符)。

     当程序执行到文件末尾时,PHP将自动释放它使用的全部资源(释放内存),这将触发MyClass对象的析构行为。

     覆盖:1.覆盖继承来的属性和方法,只需在新类中重新声明这个属性或方法,就可以简单地覆盖掉它。

      2.覆盖时保留被覆盖方法的功能(在原有基础上扩展),使用parent关键字加上作用域解析符(::)

<?php

class MySonClass{

    public function _construct(){

            parent::__construct();//调用父类的构造函数
            echo "在类".__CLASS__."中的一个新构造函数。<br/>";

    }
}

?>

  类的属性或方法的可见度:public、private、protected、static

  注意:protected修饰的属性或方法,只能在本类或其后代类的内部访问它。

  一个方法或属性,若声明为static,则不需要生成类的实例即可访问它。只需要提供类的名字,加上作用域解释符和属性或方法的名字即可。

  静态属性的最大好处是,所有实例共享一个值,一个实例修改了一个静态属性的值,其他实例的该属性也自动随之更改。

  

 

 

posted @ 2012-12-28 00:36  翔宇后生  阅读(333)  评论(0编辑  收藏  举报