PHP學習筆記6:面向對象的PHP

讀《PHP和MySQL Web開發》筆記合集: php

http://my.oschina.net/bluefly/blog/478580 html

一、面向對象和類 web

在面向對象的程序中,對象是一個 被保存數據操做這些數據的操做方法的惟1、可標識的集合。
封裝性、多態性(PHP中,只有類的成員函數能夠試多態的,普通函數不支持)、集成。

二、特殊函數
好比構造函數(__construct())、析構函數(__destruct())、set、get等都是 雙下劃線__開頭,雙下劃線代表在PHP中,這些函數具備特殊的意義,咱們並不會直接訪問這些函數。

三、this指針
在一個類中,能夠訪問一個特殊的指針$this.

四、修飾符
是否能夠在類的外部訪問一個屬性,是有修飾符肯定的。
public:不寫的話,默認是這個。公有的屬性或方法能夠在類的內部和外部訪問。
private:私有屬性和方法只能在類內部訪問,私有的屬性和方法將不會被繼承。
protected:被保護的屬性和方法只能在類內部訪問,但能夠被繼承。

五、extends繼承 
PHP不支持多重集成,可是有「接口」這一特性
class B extends A
{
}

六、接口
若是須要實現多重繼承,PHP中能夠經過接口,接口能夠看作是多重繼承問題的解決方法,相似於其餘面向對象編程語言所支持的接口實現,好比Java。
接口的思想是: 指定一個實現了該接口的類必須實現的一系列函數
好比:
interface Displayable
{
function display();
}

class webPage implements Displayable
{
function display()
{
//
}
}
 
七、子類中重載
在子類中,再次聲明相同的屬性和操做也是有效的。
同時注意,parent關鍵字容許調用父類操做的最第一版本,好比從B中調用A::operation,
parent::operation();

八、final關鍵字禁止繼承和重載
能夠放在函數前面,或者類前面,好比:
final function operation()  
{...}
函數不容許重載
final class A
{...}
類不循序重載

九、PHP結束和開始標記的靈活處理
若是函數體內部須要顯示沒有通過PHP處理的大量靜態HTML,那麼簡單地使用PHP結束標記(?>)、輸入HTML,而後再 在函數體內部使用一個PHP打開標記(<?php),例子:
public function DisplayStyles()
  { 
?>   
  <style>
    h1 {
        color:white; font-size:24pt; text-align:center; 
        font-family:arial,sans-serif
    }
    .menu {
        color:white; font-size:12pt; text-align:center; 
        font-family:arial,sans-serif; font-weight:bold
    }
    td {    
        background:black
    }
    p {
        color:black; font-size:12pt; text-align:justify; 
           font-family:arial,sans-serif
    }
    p.foot {
        color:white; font-size:9pt; text-align:center; 
        font-family:arial,sans-serif; font-weight:bold
    }
    a:link,a:visited,a:active {
        color:white
    }
  </style>
<?php
  }

十、使用動態腳本和靜態頁面取捨
用腳本穿件網頁要求更多計算機處理器的處理操做,由於它並非簡單地從硬盤載入靜態HTML頁而後再送到瀏覽器。在一個業務繁忙的網站中,處理速度是很重要的,應該儘可能使用靜態HTML網頁,或者儘量緩存腳本輸出,從而減小在服務器的載入操做。

十一、理解PHP面向對象常量和靜態
1)常量
Per-Class倡導的思想, 用const關鍵字,這個常量不須要初始化該類就可以使用
<?php
class Math
{
const pi = 3.14159;
}
echo "Math::pi = ".Math::pi."\n";
?>
2)實現靜態方法
<?php
class Math
{
static function squared($input)
{
    return $input*$input;
}
}
echo Math::squared(8);
?>
注意:在一個 靜態方法中,不能使用this 關鍵字。由於可能會沒有能夠引用的對象實例

十二、檢查類的類型
instanceof 關鍵字容許檢查一個對象的類型,能夠檢查一個對象是不是特定類的實例,是不是從某個類繼承過來的, 或者是否實現了某個接口。
instanceof  是一個高效率的條件操做符。
前提:類B繼承於類A
{$b instanceof B} 將返回true,
{$b instanceof A} 將返回true,
{$b instanceof Displayable} 將返回false, 類B沒有實現接口Displayable。

1三、PHP類型提示
function check_hint(  B $someclass)
{
 //...
}
注意:一般,當在PHP中向一個函數傳遞一個參數時,不能傳遞該參數的類型。使用類類型提示,能夠指定必須傳入的參數類類型,不然將產生一個錯誤。類型檢查等價於instanceof 的做用。
若是 check_hint( $a );
將產生以下致命錯誤:
Fatal error: Argument 1 must be an instance of B
注意:若是指定的是類A 而傳入了B的實例,將不會產生任何錯誤,由於類B繼承了類A。

1四、延遲靜態綁定
該特性(late static binding)容許在一個靜態繼承的上下文中對一個被調用類的引用。父類可使用子類重載的靜態方法。
<?php
class A
{
    public static function who()
        {
            echo __CLASS__;
        }
    public static function test()
        {
            static::who();  //here
        }

}

class B extends A
{
    public static function who()
        {
            echo __CLASS__;
        }
}

?>
B::test();
輸出:
B

1五、克隆對象
$c = clone $b;
將建立與對象$b 具備相同類的副本,並且具備相同的屬性值。
注意:若是想改變這種行爲,在基類中穿件一個__clone() 方法,這個方法相似於構造函數或者析構函數,由於不會直接調用,當使用clone關鍵字時,該方法被調用。
若是要克隆一個包含有對象引用的類,可能須要得到該對象的第二個副本,而不是第二個引用,因此這就是爲何要定製__clone()方法的緣由。
                
1六、抽象類
抽象類,這些類不能被實例化,類方法也沒有實現。只用來被繼承,確保每個子類都包含並重載了某些特定的方法。
如抽象方法:
abstract operationX($param1, $param2);
包含抽象方法的任何類自己必須是抽象的:
abstract class A
{
    abstract operationX($param1, $param2);
}

1七、使用__call() 重載方法
方法的重載在許多面向對象變成語言中都是很是常見的,可是在PHP中卻不是很是有用,由於咱們習慣使用靈活的類型和(容易實現)可選的函數參數。
要使用該方法,必須實現__call() 方法,以下例所示:
public function __call($method, $p)
{
    if ($method == "display")
    {
        if (is_object($p[0]))
        {
            $this->displayObject($p[0]));
        }
        else if (is_array($p[0]))
        {
            $this->displayArray($p[0]));
        }
        else
        {
            $this->displayScalar($p[0]));
        }

    }
}

__call()方法必須帶有兩個參數,第一個包含了被調用的方法名稱,第二個參數包含了傳遞給該方法的參數數組。
注意:display()方法是不用實現的,其餘幾個方法按照個人理解,是要實現的。
調用實例:
$ov = new overload;
$ov->display(array(1,2,3));
$ov->display('cat');
第一個將調用displayArray(),第二個將調用displayScalar();。

1八、__autoload()方法
這是一個單獨的函數,不是一個類方法,能夠在任何類聲明以外聲明這個函數。若是實現了該函數,它將在實例化一個尚未被聲明的類時自動調用。去嘗試包含或請求任何用來初始化所需類的文件。
例子:
function __autoload($name)
{
    include_once $name.".php";
}

1九、實現迭代器和迭代
PHP的面向對象引擎,支持經過foreach()方法經過循環方式取出一個對象的全部屬性,就像數組方式同樣。例子:
class myClass
{
    public $a="5";
    public $b="7";
    public $c="9";
}
$x = new myClass;
foreach ($x as $attriute )
{
    echo $attriute."<br />";
}
若是須要一些更加複雜的行爲,能夠實現一個iterator(迭代器)。要實現一個迭代器,必須實現 IteratorAggregate接口,而且定義一個可以返回該類實例的getIterator方法。這個類必須實現Iterator接口。
<?php
class ObjectIterator implements Iterator {

   private $obj;
   private $count;
   private $currentIndex;

   function __construct($obj)
   {
     $this->obj = $obj;
     $this->count = count($this->obj->data);
   }
   function rewind()
   {
     $this->currentIndex = 0;
   }
   function valid()
   {
     return $this->currentIndex < $this->count;
   }
   function key()
   {
     return $this->currentIndex;
   }
   function current()
   {
     return $this->obj->data[$this->currentIndex];
   }
   function next()
   {
     $this->currentIndex++;
   }
}

class Object implements IteratorAggregate
{
  public $data = array();

  function __construct($in)
  {
    $this->data = $in;
  }

  function getIterator()
  {
    return new ObjectIterator($this);
  }
}

$myObject = new Object(array(2, 4, 6, 8, 10));

$myIterator = $myObject->getIterator();
for($myIterator->rewind(); $myIterator->valid(); $myIterator->next())
{
  $key = $myIterator->key();
  $value = $myIterator->current();
  echo $key." => ".$value."<br />";
}

?>



1九、將類裝換成字符串
若是在類中定義了一個__toString()函數,當嘗試打印該類時,會調用這個函數。__toString()函數的 全部返回內容都將被echo語句打印。
用法如:
$p = new Printable;
echo $p;
實現如:
class Printable()
{
public $testone;
public $testtwo;
public function __toString()
    {
        return(var_export($this,TRUE));
    }
}

注意:var_export()函數打印出了類中的全部屬性值。

20、使用Reflection(反射)API
反射是經過訪問已有類和對象來找到類和對象的結構和內容的能力。
當使用未知或文檔不詳的類時,這個功能就很是游泳,好比通過編碼的PHP腳本。
例子:
<?php

require_once("page.inc");

$class = new ReflectionClass("Page");
echo "<pre>".$class."</pre>";

?>

page.inc
<?php
class Page
{
  // class Page's attributes
  public $content;
  public $title = "TLA Consulting Pty Ltd";
  public $keywords = "TLA Consulting, Three Letter Abbreviation, 
                     some of my best friends are search engines";
  public $buttons = array("Home"   => "home.php", 
                        "Contact"  => "contact.php", 
                        "Services" => "services.php", 
                        "Site Map" => "map.php"
                    );

  // class Page's operations
  public function __set($name, $value)
  {
    $this->$name = $value;
  }

  public function Display()
  {
    echo "<html>\n<head>\n";
    $this -> DisplayTitle();
    $this -> DisplayKeywords();
    $this -> DisplayStyles();
    echo "</head>\n<body>\n";
    $this -> DisplayHeader();
    $this -> DisplayMenu($this->buttons);
    echo $this->content;
    $this -> DisplayFooter();
    echo "</body>\n</html>\n";
  }

  public function DisplayTitle()
  {
    echo "<title>".$this->title."</title>";
  }

  public function DisplayKeywords()
  {
    echo "<meta name=\"keywords\" 
          content=\"".$this->keywords."\"/>";
  }

  public function DisplayStyles()
  { 
?>   
  <style>
    h1 {
        color:white; font-size:24pt; text-align:center; 
        font-family:arial,sans-serif
    }
    .menu {
        color:white; font-size:12pt; text-align:center; 
        font-family:arial,sans-serif; font-weight:bold
    }
    td {    
        background:black
    }
    p {
        color:black; font-size:12pt; text-align:justify; 
           font-family:arial,sans-serif
    }
    p.foot {
        color:white; font-size:9pt; text-align:center; 
        font-family:arial,sans-serif; font-weight:bold
    }
    a:link,a:visited,a:active {
        color:white
    }
  </style>
<?php
  }

  public function DisplayHeader()
  { 
?>   
  <table width="100%" cellpadding="12" 
         cellspacing="0" border="0">
  <tr bgcolor ="black">
    <td align ="left"><img src = "logo.gif" /></td>
    <td>
        <h1>TLA Consulting Pty Ltd</h1>
    </td>
    <td align ="right"><img src = "logo.gif" /></td>
  </tr>
  </table>
<?php
  }

  public function DisplayMenu($buttons)
  {
    echo "<table width=\"100%\" bgcolor=\"white\" 
          cellpadding=\"4\" cellspacing=\"4\">\n";
    echo "<tr>\n";

    //calculate button size
    $width = 100/count($buttons);

    while (list($name, $url) = each($buttons)) {
      $this -> DisplayButton($width, $name, $url, 
               !$this->IsURLCurrentPage($url));
    }
    echo "</tr>\n";
    echo "</table>\n";
  }

  public function IsURLCurrentPage($url)
  {
    if(strpos($_SERVER['PHP_SELF'], $url )==false)
    {
      return false;
    }
    else
    {
      return true;
    }
  }

  public function 
      DisplayButton($width,$name,$url,$active = true)
  {
    if ($active) {
      echo "<td width = \"".$width."%\">
      <a href=\"".$url."\">
      <img src=\"s-logo.gif\" alt=\"".$name."\" border=\"0\" /></a>
      <a href=\"".$url."\"><span class=\"menu\">".$name."</span></a>
      </td>";
    } else {
      echo "<td width=\"".$width."%\">
      <img src=\"side-logo.gif\">
      <span class=\"menu\">".$name."</span>
      </td>";
    }  
  }

  public function DisplayFooter()
  {
?>
<table width="100%" bgcolor="black" cellpadding="12" border="0">
<tr>
<td>
    <p class="foot">&copy; TLA Consulting Pty Ltd.</p>
    <p class="foot">Please see our <a href ="">legal 
    information page</a></p>
</td>
</tr>
</table>
<?php
  }
}
?>
Class [  class Page ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 2-152 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [4] { Property [  public $content ] Property [  public $title ] Property [  public $keywords ] Property [  public $buttons ] } - Methods [10] { Method [  public method __set ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 16 - 19 - Parameters [2] { Parameter #0 [  $name ] Parameter #1 [  $value ] } } Method [  public method Display ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 21 - 33 } Method [  public method DisplayTitle ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 35 - 38 } Method [  public method DisplayKeywords ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 40 - 44 } Method [  public method DisplayStyles ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 46 - 74 } Method [  public method DisplayHeader ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 76 - 90 } Method [  public method DisplayMenu ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 92 - 107 - Parameters [1] { Parameter #0 [  $buttons ] } } Method [  public method IsURLCurrentPage ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 109 - 119 - Parameters [1] { Parameter #0 [  $url ] } } Method [  public method DisplayButton ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 122 - 136 - Parameters [4] { Parameter #0 [  $width ] Parameter #1 [  $name ] Parameter #2 [  $url ] Parameter #3 [  $active = true ] } } Method [  public method DisplayFooter ] { @@ D:\wamp\www\study\book\Chapter 06\page.inc 138 - 151 } } }
這裏,使用了Reflection類的__toString()方法來打印這個數據。
相關文章
相關標籤/搜索