寸草不生的周六-PHP之物件導向(三)

來源:互聯網
上載者:User
荒蕪的周六-PHP之物件導向(三)

  hi  

又是開森的周六了。積攢的兩周的衣服,終於是差不多洗完了。大下午的才來學點東西~~

1、PHP物件導向(三)

四、OOP的進階實踐

4.3 Static-靜態成員

date_default_timezone_set("PRC");
/**
* 1. 類的定義以class關鍵字開始,後面跟著這個類的名稱。類的名稱命名通常每個單詞的第一個字母大寫。
* 2. 定義類的屬性
* 3. 定義類的方法
* 4. 執行個體化類的對象
* 5. 使用對象的屬性和方法
*/

class Human{
public $name;
public $height;
public $weight;

public function eat($food){
echo $this->name."'s eating ".$food."
";
}
}

class Animal{
public $kind;
public $gender;
}


class NbaPlayer extends Human{
// 類的屬性的定義
public $name="Jordan";// 定義屬性
public $height="198cm";
public $weight="98kg";
public $team="Bull";
public $playerNumber="23";
private $age="44";
public $president="David Stern";



// 類的方法的定義
public function changePresident($newP){
$this->president=$newP;
}

public function run() {
echo "Running
";
}

public function jump(){
echo "Jumping
";
}

public function dribble(){
echo "Dribbling
";
}

public function shoot(){
echo "Shooting
";
}

public function dunk(){
echo "Dunking
";
}

public function pass(){
echo "Passing
";
}

public function getAge(){
echo $this->name."'s age is ".$this->age;
}

function __construct($name, $height, $weight, $team, $playerNumber){
print $name . ";" . $height . ";" . $weight . ";" . $team . ";" . $playerNumber."\n";
$this->name = $name; // $this是php裡面的偽變數,表示對象自身
$this->height = $height; // 通過$this可以設定對象的屬性值
$this->weight = $weight;
$this->team = $team;
$this->playerNumber = $playerNumber;
}

}


/**
* 1. 類執行個體化為對象時使用new關鍵字,new之後緊跟類的名稱和一對括弧。
* 2. 使用對象可以像使用其他值一樣進行賦值操作
*/
$jordan = new NbaPlayer("Jordan", "198cm","98kg","Bull","23");echo "
";
$james=new NbaPlayer("James", "203cm", "120kg", "Heat", "6");echo "
";
// 訪問對象的屬性使用的文法是->符號,後面跟著屬性的名稱
echo $jordan->name."
";
// 調用對象的某個方法使用的文法是->符號,後面跟著方法的名稱和一對括弧
$jordan->run();
$jordan->pass();
//子類調用父類的方法
$jordan->eat("apple");
//試著調用private,直接以及通過內部的public函數
//$jordan->age;
$jordan->getAge();echo "
";

$jordan->changePresident("Adam Silver");
echo $jordan->president."
";
echo $james->president."
";

直接從上述例子開始吧。

這裡想得到的是,把兩位對象的某一個變數同時變掉。——用static

public static $president="David Stern";

// 類的方法的定義
public static function changePresident($newP){
static::$president=$newP;//這裡static換成self更符合規範
}

注意這裡static的位置,以及,方法內的::

調用的方法也有所變動。

echo NbaPlayer::$president;echo "
";
NbaPlayer::changePresident("Adam Silver");
echo NbaPlayer::$president;echo "
";

也就是像之前說的,靜態成員就是個常量,所以不針對某個具體的對象(不受具體對象的約束)——基於此,定義&賦值&調用都不需要具體的對象參與。

內部調用要用self/static::$...

外部調用,類名::

用處就是所有的對象共用的資料。

--如果內部調用時,變數在父類中

比如說,在上述例子中,父類human中寫這麼一句話

public static $aaa="dafdfa";

然後在子類nbaplayer中,調用父類的靜態成員時,要

echo parent::$aaa;

而外部調用,按照上面說的,類名::,所以,直接父類類名即可

echo Human::$aaa;

--其他

在靜態方法中,是無法訪問其他變數的,也就是說,不能用$this->

--小結

/**
* 靜態成員
* 1. 靜態屬性用於儲存類的公有資料
* 2. 靜態方法裡面只能訪問靜態屬性
* 3. 靜態成員不需要執行個體化對象就可以訪問
* 4. 類內部,可以通過self或者static關鍵字訪問自身的靜態成員
* 5. 可以通過parent關鍵字訪問父類的靜態成員
* 6. 可以通過類名稱在外部存取類的靜態成員
*/

4.4 Final成員

--問題

不希望某個類擁有子類;

不希望子類修改父類中的某個變數(避免重寫?)

--final

》=php5版本

舉個例子

class BaseClass{
public function test(){
echo "BaseClass::test called
";
}

public function test1(){
echo "BaseClass::test1 called
";
}
}

class ChildClass extends BaseClass{
public function test(){
echo "ChildClass::test called
";
}
}

$obj=new ChildClass();
$obj->test();

子類中編寫跟父類中完全一致的方法名(內容可以不同),會完成對父類方法的重寫

所以,不希望被重寫的父類中的方法,寫上final

final public function test(){

依此類推,對於不想有子類的父類,在類名那裡寫上final

final class BaseClass{

--小結

/**
* 重寫和Final
* 1. 子類中編寫跟父類完全一致的方法可以完成對父類方法的重寫
* 2. 對於不想被任何類繼承的類可以在class之前添加final關鍵字
* 3. 對於不想被子類重寫(overwrite, 修改)的方法,可以在方法定義前面添加final關鍵字
*/

4.5 資料訪問

先把final都去掉

--parent

然後再子類中的方法中寫

parent::test();

運行後會發現,依然可以通過parent的關鍵字調用父類中,即使是被重寫的資料

--self

然後在父類中的方法test中寫

self::test1();

運行後,發現self可以調用同一個類中的資料(其他方法/靜態變數/常量const)

--小結

/**
* 資料訪問補充
* 1. parent關鍵字可以用於調用父類被重寫的類成員
* 2. self關鍵字可以用於訪問類自身的成員方法,也可以用於訪問自身的靜態成員和類常量;不能用於訪問類自身的屬性;訪問類常量時不用在常量名稱前面加$符號
* 3. static關鍵字用於訪問類自身定義的靜態成員,訪問靜態屬性時需要在屬性名稱前面添加$符號
*/

4.6 對象介面

非常重要!!!

--問題

不同的類,有著相同的行為,但相同的行為又有著不同的實現方法。

比如人和動物都會吃東西,但吃的方式方法又不太一樣。

--定義

介面就是把不同類的共同行為進行了定義,然後在不同的類裡面實現不同的功能。

--栗子

//定義一個介面
interface ICanEat{
public function eat($food);
}

可以看到,介面中並沒有方法的具體實現,但必須有方法!

那麼,下面是,“人類會吃”

//具體對象,串連到介面
class Human implements ICanEat{

public function eat($food){
echo "Human eating ".$food.".
";
}
}

$obj=new Human();
$obj->eat("shit");

請忽略我給出的“食物”。

注意,不再用extends,而是implements。然後,同樣是方法名的完全相同。然後,對象必須/最好實現方法。

繼續

interface ICanEat{
public function eat($food);
}

//具體對象,串連到介面
class Human implements ICanEat{
public function eat($food){
echo "Human eating ".$food.".
";
}
}

class Animal implements ICanEat{
public function eat($food){
echo "Animal eating ".$food.".
";
}
}


$obj=new Human();
$obj->eat("shit");

$monkey=new Animal();
$monkey->eat("banana");

讓動物也吃起來!

--逆向操作

判斷某個對象是否串連了某個介面。

var_dump($obj instanceof ICanEat);

會返回boolean值。

--更多的栗子

interface ICanPee extends ICanEat{
public function pee();
}

class Demon implements ICanPee{
public function pee(){
echo "Can demon pee?";
}
public function eat($food){
echo "Can demon eat ".$food;
}
}

$ghost=new Demon();
$ghost->pee();
$ghost->eat("shit");

介面本質上也是類,可以被繼承/繼承,但是使用繼承介面的介面,所有父類、“爺類”的方法都要有具體實現。

--小結

/**
* 介面
* 1. 介面的基本概念和基本使用方法
* 2. 介面裡面的方法沒有具體的實現
* 3. 實現了某個介面的類必須提供介面中定義的方法
* 4. 不能用介面建立對象,但是能夠判斷某個對象是否實現了某個介面
* 5. 介面可以繼承介面(interface extends interface)
* 6. 介面中定義的所有方法都必須是公有,這是介面的特性。
*/

aaaaaaaaaaaaaa

bu xiang xie le....................

ming tian yao ge ..............

1樓rickon
來看望樓主了,樓主好有毅力,我連跑步都堅持不了一星期的人,樓主有什麼訣竅嗎?
Re: 韌還
@rickon,可能分心的東西沒太多吧。沒有女友,也不玩其他什麼遊戲,甚至連朋友圈都關了(因為那個太瑣碎,費事兒)。,平時白天要去教研室,然後晚上沒事兒就學習學習;周末也就睡睡懶覺什麼的。,然後,關鍵的兩條可能是,一個是明年要去找工作,學點東西心理上好一點;再一個是跟著網上的進度在走,自己學的話,開頭太難,這樣對我這種自製力差的要好一點。,對於您提出的堅持不下來,我覺得您可以找一些東西進行正反饋——簡單的說,就是每堅持一天都有收穫,但你要把收穫可視化,就像是打遊戲,打一會兒有升級一樣,直觀的數位東西會有較大的影響。,希望對你有協助。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.