PHP學習——19 PHP面向對象(介紹與創建)

一、介紹

面向對象編程(OOP),是編程思想,不是技術。學習面向對象編程主要有兩點:
1.基本語法   2.編程思想

首先我們需要了解核心概念:類與對象。類是生成對象的模版,對象是類的一個實例。如:人類和人,一個人(個體)是人類(整體),但是人類包含了全部的人;類與對象的關係就是整體類別與個體之間的關係。

二、類的創建(類的聲明與內部屬性和方法的定義)

<?php 
// 每個類的定義都以關鍵字 class 開頭,後面跟着類名,後面跟着一對花括號,裏面包含有類的屬性與方法的定義。
class Student{
	// 屬性與方法
	// 屬性的聲明必須以訪問控制符開頭
	public $name = 'Tom'; // 公共屬性,外部可以訪問
	// 屬性訪問控制符:public/private和protected
	private $age = 14; // 私有屬性,只允許類中的訪問調用
	protected $sex = 'male'; // 受保護的,僅允許本類或子類訪問

	// 屬性的類型可以是標量(整數、浮點、字符串、布爾值),符合類型(數組、對象) 

	// 方法也必須以訪問控制符開頭
	public function getName(){
		// $this是僞變量,總是指向當前對象
		return $this->name;
	}
	public function getAge(){
		return $this->age;
	}
}
// 創建對象的過程,就是類的實例化
$stu = new Student();
echo $stu->getName().'<br>'; // 用對象訪問運算符來訪問屬性方法
// echo $stu->age; // private定義的屬性不能在外部訪問
echo $stu->getAge();
// Tom
// 14
// 對象是一個引用變量,對象的複製並沒有創建新的對象,而是創建一個當前對象的引用
$stu2 = $stu;
echo $stu->name; // Tom
echo '<br>';
$stu2->name = 'Peter';
echo $stu->name; // Peter
// 由於是對象的引用,$stu2和$stu操作的都是同一個對象,所以$stu->name的值變成了 Peter
?>

三、對象的創建(6種方式)

<?php 
class Student
{
	public $name = 'Peter';
	public function getName(){
		return $this->name;
	}
	public function createStu(){
		return new self();
	}
	public function getStatic(){
		return new static();
	}
}
// 1. 使用new 類名()來創建一個對象
$stu = new Student();// 當不需要傳入參數的時候,可以省去括號
echo $stu->name; // Peter
echo '<br>';
echo $stu->getName(); // Peter
echo '<hr>';

// 2. 將類名,以字符串的方式放在變量中
$className = 'Student';
$stu2 = new $className();
echo $stu2->name; // Peter
echo '<hr>';

// 3. 用對象來創建對象,它創建的是一個新對象
$stu3 = new $stu(); // $stu3 與 $stu是不同的
echo get_class($stu3); //Student
echo '<br>';
echo $stu3->name; // Peter
echo '<hr>';

// 4. 用new self(),創建當前類的實例,創建的是新對象
$stu40 = new Student();
$stu4 = $stu40->createStu();
echo $stu40->name; // Peter
$stu40->name = 'Charry';
echo $stu40->name; // Charry
echo $stu4->name; // Peter
echo '<hr>';

// 5. 用new parent(),創建父類的實例,創建的是新對象
// Student2 繼承 Student
class Student2 extends Student 
{
	public $name = 'Peter Parker';
	public function createParent(){
		return new parent();
	}
}
$stu50 = new Student2();
$stu5 = $stu50->createParent();
echo $stu50->name; // Peter Parker
echo '<br>';
$stu50->name = 'Charry';
echo $stu50->getName(); // Charry
echo '<br>';
echo $stu5->name; // Peter
echo '<hr>';

// 6. 基於當前調用的類來創建:new static
$stu6 = (new Student())->getStatic();
$stu7 = (new Student())->createStu();
echo get_class($stu6);//Student
echo get_class($stu7);//Student
echo '<hr>';
$stu8 = (new Student2())->getStatic();
$stu9 = (new Student2())->createStu();
echo get_class($stu8);//Student2
// new static() 創建的對象,直接與調用者綁定,靜態延遲綁定
echo get_class($stu9);//Student
?>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章