一、介紹
面向對象編程(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
?>