PHP 中的面向对象编程:通向大型 PHP 工程的办法

2016-02-19 16:48 0 1 收藏

今天图老师小编要向大家分享个PHP 中的面向对象编程:通向大型 PHP 工程的办法教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - Web开发 】

  这篇文章介绍在 PHP 的面向对象编程(OOP)。我将演示如何用面向对象的概念编出较少的代码但更好的程序。祝大家好运。 

  面向对象编程的概念对每一个作者来说都有不同的看法,我提醒一下一个面向对象语言应有的东西:

  - 数据抽象和信息隐藏

  - 继承

  - 多态性

  在PHP中使用类进行封装的办法:

  

?phpclass Something {    // In OOP classes are usually named starting with a cap letter.    var $x;    function setX($v) {      // Methods start in lowercase then use lowercase to seprate      // words in the method name example getValueOfArea()      $this-x=$v;    }    function getX() {      return $this-x;    }}?

  当然你可以用你自己的办法,但有一个标准总是好的。

  PHP 中类的数据成员使用 "var" 定义,数据成员是没有类型直到被赋值。一个数据成员可能是一个 integer、数组、联合数组 (associative array) 或甚至对象(object). 方法在类里定义成函数,在方法里存取数据成员,你必须使用 $this-name 这样的办法,否则对方法来说是一个函数的局部变量。

  使用 new 来创建一个对象

  $obj = new Something;

  然后使用成员函数

  $obj-setX(5);

  $see = $obj-getX();

  setX 成员函数将 5 赋给对象(而不是类)obj 中成员变量, 然后 getX 返回值 5.

  你也可以用对象引用来存取成员变量,例如:$obj-x=6; 然而,这不一种好的面向对象编程的方法。我坚持你应使用成员函数来设置成员变量的值和通过成员函数来读取成员变量。如果你认为成员变量是不可存取的除了使用成员函数的办法,你将成为一个好的面向对象程序员。但不幸的是 PHP 本身没有办法声明一个变量是私有的,所以允许糟糕的代码存在。

  在 PHP 中继承使用 extend 来声明。

  

?phpclass Another extends Something {    var $y;    function setY($v) {      // Methods start in lowercase then use lowercase to seperate      // words in the method name example getValueOfArea()      $this-y=$v;    }    function getY() {      return $this-y;    }}?

  这样类 "Another" 的对象拥有父类的所用成员变量及方法函数,再加上自己

  的成员变量及成员函数。如:

  $obj2=new Another;

  $obj2-setX(6);

  $obj2-setY(7);

  多重继承不被支持,所以你不能让一个类继承多个类。

  在继承类中你可以重新定义来重定义方法,如果我们在 "Another" 重新定义 getX,那么我们不再能存取 "Something" 中的成员函数 getX. 同样,如果我们在继承类中声明一个和父类同名的成员变量,那么继承类的变量将隐藏父类的同名变量。

  你可以定义一个类的构造函数, 构造函数是和类同名的成员函数,在你创建类的对象时被调用。

  

?phpclass Something {  var $x;  function Something($y) {    $this-x=$y;  }  function setX($v) {    $this-x=$v;  }  function getX() {    return $this-x;  }}?

  所以可以用如下方法创建对象:

  $obj=new Something(6);

  构造函数自动赋值 5 给成员变量 x,构造函数和成员函数都是普通的PHP函数,所以你可以使用缺省参数。

  function Something($x="3",$y="5")

  然后:

  $obj=new Something(); // x=3 and y=5

  $obj=new Something(8); // x=8 and y=5

  $obj=new Something(8,9); // x=8 and y=9

  缺省参数的定义方法和 C++ 一样,因此你不能传一个值给 Y 但让 X 取缺省值,实参的传递是从左到右,当没有更多的实参时函数将使用缺省参数。

  只有当继承类的构造函数被调用后,继承类的对象才被创建,父类的构造函数没有被调用,这是PHP不同其他面向对象语言的特点,因为构造函数调用链是面向对象编程的特点。如果你想调用基类的构造函数,你不得不在继承类的构造函数中显式调用它。这样它能工作是因为在继承类中父类的方法全部可用。

  

?phpfunction Another() {  $this-y=5;  $this-Something(); //explicit call to base class constructor.}?

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  在面向对象编程中一种好的机制是使用抽象类,抽象类是一种不能实例化而是用来给继承类定义界面的类。设计师经常使用抽象类来强制程序员只能从特定的基类来继承,所以就能确定新类有所需的功能,但在PHP中没有标准的办法做到这一点,不过:

  如果你在定义基类是需要这个特点,可以通过在构造函数中调用 "die",这样你就可以确保它不能实例化,现在定义抽象类的函数并在每个函数中调用 "die",如果在继承类中程序员不想重定义而直接调用基类的函数,将会产生一个错误。此外,你需要确信因为PHP没有类型,有些对象是从基类继承而来的继承类创建的,因此增加一个方法在基类来辨别类(返回 "一些标识")并验证这一点,当你收到一个对象作为参数派上用场。 但对于一个恶棍程序没用办法,因为他可以在继承类中重定义此函数,通常这种办法只对懒惰的程序员奏效。当然,最好的办法是防止程序接触到基类的代码只提供界面。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  重载在PHP中不被支持。在面向对象编程中你可以通过定义不同参数种类和多少来重载一个同名成员函数。PHP是一种松散的类型语言,所以参数类型重载是没有用的,同样参数个数不同的办法重载也不能工作。

  有时候,在面向对象编程中重载构造函数很有用,所以你能以不同的方式创建不同的对象(通过传递不同的参数个数)。一个小巧门可以做到这一点:

  

?phpclass Myclass {  function Myclass() {    $name="Myclass".func_num_args();    $this-$name();    //Note that $this-$name() is usually wrong but here    //$name is a string with the name of the method to call.  }  function Myclass1($x) {    code;  }    function Myclass2($x,$y) {    code;  }}?

  通过这种办法可以部分达到重载的目的。

  $obj1=new Myclass(1); //Will call Myclass1

  $obj2=new Myclass(1,2); //Will call Myclass2

  感觉还不错!

  多态性

  多态性被定义为当在运行时刻一个对象作为参数传递时,对象能决定调用那个方法的能力。例如,用一个类定义了方法 "draw",继承类重定义 "draw" 的行为来画圆或正方形,这样你就有一个参数为 x 的函数,在函数里可以调用 $x-draw(). 如果支持多态性,那么 "draw" 方法的调用就取决于对象 x 的类型。多态性在PHP中很自然被支持(想一想这种情况在C++编译器中如果编译,那一个方法被调用?然而你不知道对象的类型是什么,当然现在不是这种情况)。幸好PHP支持多态性。

  

?phpfunction niceDrawing($x) {  //Supose this is a method of the class Board.  $x-draw();}$obj=new Circle(3,187);$obj2=new Rectangle(4,5);$board-niceDrawing($obj); //will call the draw method of Circle.$board-niceDrawing($obj2); //will call the draw method of Rectangle.?

  PHP 的面向对象编程

  纯对象论者认为PHP不是真正的面向对象语言,这是对的。PHP是一种混合语言,你可以用面向对象或传统结构编程的方法来使用它。对于大型工程,然而你可能或需要使用纯面向对象方法来定义类,并在你的工程中只使用对象和类。越来越大的工程通过使用面向对象的方法会获得益处,面向对象工程非常容易维持,容易理解并且重用。这是软件工程的基本。使用这些概念在网站设计中是未来成功的关键。

来源:https://www.tulaoshi.com/n/20160219/1613143.html

延伸阅读
标签: Web开发
作者:Leon Atkinson 翻译:Haohappy面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作的项目. 当源代码增长到一万行甚至更多的时候,每一个更动都可能导致不希望的副作用. 这种情况发生于模块间结成秘密联盟的时候,就像第一次世界大战前的欧洲. //haohappy注:喻指模块间的关联度过高,相互依赖性太强.更动一个模块导致其它模块...
标签: Web开发
PHP是一种简单,实用的动态网页编程语言。目前最新版为5.01,其使用帮助内含最新UNIX和Windows安装文档,方便初学者使用! 最新版的更新文档列出了众多更新特性,修正的bug。同4.XX一系列的版片相比,它主要的优点就是真正支持面向对象编程(OOP)。然而,5.01不同于以前4.XX版的开发水平,要成为主流动态网页开发工具还需一段时间。 ...
标签: Web开发
一直以来,我都主要是做winform方面的编程,最近做了点web方面的,所以也研究了几天的javascript。偶有心得故记之: 应用面向对象的思想在javascript中同样适用,关键的是你敢不敢用,想不想用。 我曾使用vs2005编写了一个vs2003工具箱完全类似的导航工具条,我比较喜欢在winform中通过这种方式向用户提供应用程序功能的导航。所...
标签: Web开发
我们都知道如何从Mysql获取我们需要的行(记录),读取数据,然后存取一些改动。很明显也很直接,在这个过程背后也没有什么拐弯抹角的。然而对于我们使用面对对象的程序设计(OOP)来管理我们数据库中的数据时,这个过程就需要大大改进一下了。这篇文章将对如何设计一个面对对象的方式来管理数据库的记录做一个简单的描述。你的数据当中的所...
    在写面向对象的WEB应用程序方面JavaSciprt是一种很好的选择.它能支持OOP.因为它通过原型支持继承的方式和通过属性和方法的方式一样好.很多开发者试图抛弃JS,试着用C#或JAVA仅是因为JS不是他认为合适的面向对象的语言.许多人还没有认识到javascript支持继承.当你写面向对象的代码时.它能给你很强大的能量.你也可以使用它写出...

经验教程

638

收藏

100
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部