今天学的东西,需要有OOP的观念,也就是物件导向的观念,由于之前自己学过JS后,以为物件都是可以直接创建。但事实并非如此,而是需要搭配class(类)来创建我们的物件。
class好比设计蓝图,而我们可以利用这个蓝图,去创建物件。如class Car => 创建 obj Audi、obj Toyota、一些method...
class命名不可为数字开头,大小写没有分
,所以不能在宣告一个class dog。
而此处我们宣告变数,型态有public为开放,内外都可呼叫
,如果没有特别加,预设就是public
。private
为私有(一般会在前面加上底线
),只能在当前类的内部呼叫
,而其实还有一个叫做protected受保护
,跟private一样只能在类的内部呼叫
、取用,而之后会操作并详解。而通常不会在class宣告变数的地方赋予初始值,除非所有实体化的物件需要某个属性是统一的值
,大多都是使用private或protected来增加对属性的控制性,一般都是透过方法来实现对属性的修改。
class Dog { private $_breed; private $_age; private $_gender;}
建构式
(__construct()
),也就是在new完物件后,会执行一次,也就是初始化的概念。
此处我们利用建构式,获取物件所传来的参数,并赋予给我们宣告好的变数。
public function __construct($objBreed, $objAge, $objGender) { // 利用$this可以指向obj本体 $this->_breed = $objBreed; $this->_age = $objAge; $this->_gender = $objGender; $this->display(); }
而我们在class外面,利用new去创建一个实体化物件。
// $bogi = new Dog;// 如果在建构式需要传入参数,就须加入()。$bogi = new Dog("doge", 20, "male");var_dump($bogi);// object(Dog)#1 (3) { ["_breed":"Dog":private]=> string(4) "doge" ["_age":"Dog":private]=> int(20) ["_gender":"Dog":private]=> string(6) "female" }// 这个Dog物件有3个属性 ["对应属性名及详情"] => 属性值的类型(长度) "属性值
而后我们在class内写了一些方法,display在初始化的时候,用来呼叫我们的方法及一些数据等等。
在class外要指向对应属性需要,$物件名->属性名如:$bogi-> _ breed(如果为变数为private则无法从外面指向),而在class内仅需$this即可指向如:$this-> _ breed 。
public function display() { // return $age; //这样写$age只是纯变数,与我们所设置的public $age(物件中的属性)无相关 // 利用$this可以指向obj本体($bogi),藉此来指向物件下的属性 // return $this->_gender; echo $this->sleep(); echo "<br/>"; echo $this->showBreed(); echo "<br/>"; echo $this->showAge(); echo "<br/>"; echo $this->showGender(); echo "<br/>"; $this->changeGender('female'); echo $this->showGender(); echo "<hr/>"; $this->removeAge(); } public function showBreed() { echo $this->_breed; } public function showAge() { echo $this->_age; } public function showGender() { echo $this->_gender; }
我们可以在函数中去更改属性值,观察删除后的物件,我们在此处在创建一个物件bogi2去做比较,可发现age已被删除,很少用到删除及新增,大多使用修改读取居多。
// 更改性别 private function changeGender($gender) { // 修改属性 $this->_gender = $gender; } // 删除年龄 private function removeAge() { // 删除属性 unset($this->_age); } $bogi2 = new Dog("shiba", "87", "female"); var_dump($bogi2); echo "<hr>";
CLASS 可以获取类别名称,而通常以const来设置常数,与js相同,但如果我们想获取常数的话,无法用一般的方法进行获取($jojo->PI),因为它会去物件下找为$PI的常数,但我们并没有,之后会讲解如何获取常数的部分。
class Human{ public function display() { echo __CLASS__; } // 设置常数 const PI = 3.14;}$jojo = new Human();// 想要读取常数的话,这样会获取不到,因为它会去找为$PI的常数,但我们并没有。$jojo->PI;$jojo->display(); //Human
而这是在网上抓的一个基本php执行的流程。