php 面向對象
js面向對象:
類:具備相同特徵的一些對象的集合;php
對象:具體某一個事物了,均可以叫對象;html
類:經過function定義的類,因此js裏類的本質爲函數;函數
類的標誌:首字母大寫(函數名 ) 函數內部使用this 調用函數使用new關鍵字;post
1.類和函數天生有prototype和__proto__兩個屬性,prototype又是一個對象,天生有一個constructor的屬性,屬性值函數或類自己;this
2.普通對象:天生有一個__proto__的屬性,這個屬性又是一個對象,指向他的父類;url
引用關係:prototype
fn.prototype.init=function(){}翻譯
fn.prototype={ init:function(){} }htm
他們的區別?對象
前者不會改變原有引用關係,後者會改變原有的引用關係;
注意:每一個變量只能有一個地址
拷貝:淺拷貝,深拷貝;
php的面向對象
類的建立:class建立;
class Person{}
對象的建立:使用new關鍵字:
$p:new Person(); (若是裏面沒有參數,能夠不加括號);
成員的添加:須要3個修飾符:public protected private
public:定義公共的屬性,任何地方均可以使用,類的外部,類的內部,子類(公共)
protected:定義受保護的屬性和方法,只能在類的內部和子類使用(受保護)
private:定義私有的屬性和方法,只能在自身的類使用(私有)
案例:
public $word="hello world"; (解析:定義公共的變量word)
方法成員的前面若是不加修飾符,默認爲public;
成員的調用: 須要使用->符號;
$p->fn() (使用成員的屬性和方法的時候,屬性和方法前面不帶$符)
特殊對象:$this 指向實例化的對象;
案例:
class person{
public $name="lisi"; //(php每一個語句後面必定要加;)
function fn(){
echo $this->name; //經過->調用屬性和方法;
}
$s=new Person;
$s->fn();
}
若是類的方法裏想用類的其餘屬性和方法,須要使用$this對象;
構造方法:__construct() 構造函數在實例化的時候,系統會自動調用;
析構的方法:__destruct() 咱們每次new實例化,系統都會給這個對象分一個內存空間,若是不銷燬,系統的壓力很大,因此係統有一個析構的方法__destruct() 實例化以後,系統會自動調用;
內存銷燬的原則:先進後出;
案例:構造和析構聯合使用
class Person{
public $name;
//構造的方法;
function __construct($par){
$this->name=$par
}
//析構的方法;
function __destruct(){
echo $this->name;
}
}
$p=new Person("zhang");
最後輸出zhang 翻譯爲 函數傳參使$name="zhang"; 使用完畢後,會銷燬內存; 析構會直接輸出 無需調用;
成員的賦值
$p->name=456;
echo $p->name; 單獨賦值的方法;
注意:對象中的方法不會展開var_dump() 不能用這個展開對象;
繼承的關鍵字:extends
class Child extends Person{}
$c=new Child;
var_dump($c) 這樣繼承全部屬性 可是方法卻看不見
範圍的修飾符 ::
常量的使用const的關鍵字定義常量,常量定義和使用時不能帶$符
注意:使用的時候不能用$this ,範圍修飾符:: 前面仍是這個類名,self關鍵字指向當前類名,parent關鍵字指向父類的類名;
若是子類向訪問父類的常量使用parent;
案例:
//父類
class Person{
cont age="23",
}
//子類
class Child extends Person{
const name="zhang";
function fn(){
echo self::age; //指向當前類名
echo parent::name; //指向父類
}
}
$p=new Child;
$p->fn();
靜態變量:在變量的前面加上關鍵字static,靜態的屬性不能使用->訪問,只能使用 類名::$變量名;
案例:
class Perosn{
static $name="zhang";
}
echo Person::$name;
12.重載。覆蓋;final關鍵字的使用
子類繼承父類的方法時,若是子類有和父類同名的方法從父類繼承的方法就會被覆蓋掉,這就是重載;
但若是父類的方法前面加上final則子類沒法重載父類的方法,就會報錯
案例:
//父類:
class Person{
final function fn(){
echo "個人孩子,不能起個人名字,不然會報錯"
}
}
class Child extends Person{
function fn(){
echo "我不能用我爸的名字 我要報錯"
}
}
$p=new Child;
$p->fn;
子類想使用父類的構造函數,只能使用 parent::__construct() 使用的時侯直接調用了;
案例:
//父類
class Person{
public $name="zhang";
function __construct(){
echo $this->name;
}
}
//子類
class Child extends Person{
function __construct(){
parent::__construct();
}
}
$p=new Child;
public protected private 的區別?
案例:瞭解便可:
//父類
class Person{
public function a(){
echo "a";
}
protected function b(){
echo "b";
}
private function c(){
echo "c";
}
}
$p=new Person;
$p->a(); 不會報錯
$p->b(); 會報錯
$p->c(); 會報錯
//子類
class Child extends Person{
function d(){
parent::a() //調用父類的a方法
}
function e(){
parent::b()
}
function f(){
parent::c()
}
}
$c=new Child;
echo $c->d(); 不會報錯
echo $c->e(); 不會報錯
echo $c->f(); 會報錯