熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

PHP學習筆記之面向對象設計

2013-11-15 12:31:19  來源: PHP編程 

  面向對象設計是php程序開發中一個很重要的內容塊如果你想成為高級php程序員我們必須知道面向對象設計具體用法與寫法

  維護簡單 模塊化是面向對象編程中的一個特征實體被表示為類和同一名字空間中具有相同功能的類我們可以在名字空間中添加一個類而不會影響該名字空間的其他成員

  可擴充性 面向對象編程從本質上支持擴充性如果有一個具有某種功能的類就可以很快地擴充這個類創建一個具有擴充的功能的類

  代碼重用 由於功能是被封裝在類中的並且類是作為一個獨立實體而存在的提供一個類庫就非常簡單了

  它比較適合多人合作來開發項目所以現在很多大中型網站都選擇了用OOP來開發

  本文主要講解了用php做面向對象編程的最基本的方法和代碼實例如何創建一個class和如何生成一個class的實例等等只是一個入門非常的簡單要想深學這點是遠遠不夠的只適合php的初學者

  public 表示全局類內部外部子類都可以訪問;

代碼如下 復制代碼 <?php

class Test{
public $name=Janking
$sex=male
$age=;

function __construct(){
echo $this>age<br />$this>name<br />$this>sex<br />;
}

function func(){
echo $this>age<br />$this>name<br />$this>sex<br />;
}
}


$P=new Test();
echo <br /><br />;
$P>age=;
$P>name="Rainy";
$P>sex="female";
$P>func();
?>

  private表示私有的只有本類內部可以使用;

代碼如下 復制代碼

  
<?php

class Test{
private $name=Janking
$sex=male
$age=;

function __construct(){
$this>funcOne();
}

function func(){
echo $this>age<br />$this>name<br />$this>sex<br />;
}

private function funcOne(){
echo $this>age<br />$this>name<br />$this>sex<br />;
}
}


$P=new Test();
echo <br /><br />;
$P>func();
$P>age=; // Cannot access private property Test::$age
$P>name="Rainy"; // Cannot access private property Test::$name
$P>sex="female"; // Cannot access private property Test::$female
$P>funcOne(); // Call to private method Test::funcOne() from context
?>

  protected表示受保護的只有本類或子類或父類中可以訪問;

   數據抽象和信息隱藏

   繼承

   多態性

  在PHP中使用類進行封裝的辦法

代碼如下 復制代碼

  class 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();
$see = $obj>getX();

  setX 成員函數將 賦給對象(而不是類)obj 中成員變量 然後 getX 返回值

  你也可以用對象引用來存取成員變量例如$obj>x=; 然而這不一種好的面向對象編程的方法我堅持你應使用成員函數來設置成員變量的值和通過成員函數來讀取成員變量如果你認為成員變量是不可存取的除了使用成員函數的辦法你將成為一個好的面向對象程序員 但不幸的是PHP本身沒有辦法聲明一個變量是私有的所以允許糟糕的代碼存在

  在 PHP 中繼承使用 extend 來聲明

代碼如下 復制代碼

  class 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" 的對象擁有父類的所用成員變量及方法函數再加上自己的成員變量及成員函數

代碼如下 復制代碼

  $obj=new Another;
$obj>setX();
$obj>setY();

  多重繼承不被支持所以你不能讓一個類繼承多個類

  在繼承類中你可以重新定義來重定義方法如果我們在 "Another" 重新定義 getX那麼我們不再能存取 "Something" 中的成員函數 getX 同樣如果我們在繼承類中聲明一個和父類同名的成員變量那麼繼承類的變量將隱藏父類的同名變量

  你可以定義一個類的構造函數 構造函數是和類同名的成員函數在你創建類的對象時被調用

代碼如下 復制代碼

  class Something {
var $x;

  function Something($y) {
$this>x=$y;
}

  function setX($v) {
$this>x=$v;
}

  function getX() {
return $this>x;
}
}

  ?>

  

  所以可以用如下方法創建對象

代碼如下 復制代碼

  $obj=new Something();

  構造函數自動賦值 給成員變量 x 構造函數和成員函數都是普通的PHP函數所以你可以使用缺省參數

代碼如下 復制代碼

  function Something($x=""$y="")

  然後:

代碼如下 復制代碼

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

  缺省參數的定義方法和 C++ 一樣因此你不能傳一個值給 Y 但讓 X 取缺省值實參的傳遞是從左到右當沒有更多的實參時函數將使用缺省參數

  只有當繼承類的構造函數被調用後繼承類的對象才被創建父類的構造函數沒有被調用這是PHP不同其他面向對象語言的特點因為構造函數調用鏈是面向對象編程的特點如果你想調用基類的構造函數你不得不在繼承類的構造函數中顯式調用它這樣它能工作是因為在繼承類中父類的方法全部可用

代碼如下 復制代碼

  function Another() {
$this>y=;
$this>Something(); //explicit call to base class constructor
}

  ?>

  多態性

代碼如下 復制代碼

  function niceDrawing($x) {
//Supose this is a method of the class Board
$x>draw();
}

  $obj=new Circle();
$obj=new Rectangle();

  $board>niceDrawing($obj); //will call the draw method of Circle
$board>niceDrawing($obj); //will call the draw method of Rectangle

  ?>

  和封裝有關的魔術方法

  __set()是直接設置私有成員屬性值時自動調用的方法

  __get()是直接獲取私有成員屬性值時自動調用的方法

  __isset(); 是直接isset查看對象中私有屬性是否存時自動調用這個方法

  __unset(); 是直接unset刪除對象中私有屬性時自動調用的方法


From:http://tw.wingwit.com/Article/program/PHP/201311/21100.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.