js面向對象
類:具有相同特征的一些對象的集合;
對象:具體某一個事物了,都可以叫對象;
類:通過function定義的類,所以js里類的本質為函數;
類的標志:首字母大寫(函數名 ) 函數內部使用this 調用函數使用new關鍵字;
1.類和函數天生有prototype和__proto__兩個屬性,prototype又是一個對象,天生有一個constructor的屬性,屬性值函數或類本身;
2.普通對象:天生有一個__proto__的屬性,這個屬性又是一個對象,指向他的父類;
引用關系:
fn.prototype.init=function(){}
fn.prototype={ init:function(){} }
他們的區別?
前者不會改變原有引用關系,后者會改變原有的引用關系;
注意:每個變量只能有一個地址
拷貝:淺拷貝,深拷貝;
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(); 會報錯
