類(lèi)
類(lèi)是對(duì)對(duì)象抽象的一個(gè)描述。
不能被執(zhí)行,不能使用。
類(lèi)的實(shí)例化結(jié)果就是對(duì)象
<?php
//類(lèi)的定義
class Demo
{
//成員屬性(成員變量)
public $name ="zhangsan";
//成員方法(函數(shù))
public function add()
{
echo "執(zhí)行添加...\n";
}
public function show()
{
echo "執(zhí)行瀏覽...\n";
}
}
//類(lèi)的實(shí)例化結(jié)果就是對(duì)象
$d =new Demo();
//使用(方法調(diào)用)
$d->add();
$d->show();
面向?qū)ο缶幊痰奶攸c(diǎn):封裝、繼承、多態(tài)
類(lèi)和對(duì)象的關(guān)系:
- 類(lèi)的實(shí)例化結(jié)果就是一個(gè)對(duì)象(類(lèi)的)
- 對(duì)對(duì)象的
類(lèi)的定義
[修飾符] class 類(lèi)名
{
【成員屬性】 定義變量
【成員方法】 定義函數(shù)
}
常用屬性修飾符:public、proteced、private、static、var
<?php
//定義一個(gè)stu學(xué)生類(lèi)
class Stu
{
//定義屬性
public $name ="zhangsan";
public $age = 20;
//定義成員
public function say()
{
echo "hello world!";
}
public function test()
{
$this->say();
echo $this->name.":".$this->age."\n";
}
}
//對(duì)象實(shí)例化
$stu=new $Stu();
echo $stu->name."\n";
echo $stu->age."\n";
<?php
//構(gòu)造方法和析構(gòu)方法
calss stu
{
public $name;
public $age;
//構(gòu)造方法(固定),必填兩個(gè)參數(shù),$name,$age可設(shè)默認(rèn)值
public function __construct($name,$age)
{
$this->name=$name;
$this->age=$age;
}
public function getInfo()
{
return $this->name.":".$this->age."\n";
}
//析構(gòu)
public function __destruct()
{
echo $this->name."對(duì)象被銷(xiāo)毀\n";
}
}
$s1=new Stu("李四",22);
$s2=nwe Stu("王五",23);
echo $s1->getInfo();
echo $s2->getInfo();
對(duì)象的封裝
<?php
//類(lèi)的封裝
class Stu
{
private $name="zhangsan";
private $age=20;
public function __set($param,$value)
{
this->$param=$value;
}
public function __get($param)
{
if($param=="age")
{
reture "保密";
}
return $this->param;
}
}
//測(cè)試
$s=new Stu();
$s->name="lisi";
echo $s->name;
echo $s->age;
繼承
假如B類(lèi)繼承A類(lèi),那么久繼承了A中所有非私有屬性和方法(函數(shù))。
其中A叫父類(lèi)(基類(lèi)),B叫子類(lèi)(派生類(lèi))。
class B extends A
{
}
<?php
//類(lèi)的繼承
calss $A
{
public $name="aa";
public function fun()
{
echo "aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n";
}
}
class B extends A
{
//重寫(xiě)父類(lèi)方法是為了升級(jí),提升程序的可維護(hù)性
public function fun()
{
echo "bbbbbbbbbbbbbbbbbbbbbb\n";
}
//提升可擴(kuò)展性
public function fun2()
{
echo "cccccccccccccccc\n";
}
}
final、static和const
final關(guān)鍵字:主要使用修飾了類(lèi)與成員方法(函數(shù))。
使用final關(guān)鍵字修飾類(lèi),表示這個(gè)類(lèi)不可以有子類(lèi)。
使用final關(guān)鍵字修飾的方法,不可以在子類(lèi)中被覆蓋(重寫(xiě))。
目的:安全、沒(méi)必要。static
使用static修飾的方法和屬性,不用實(shí)例化就可以使用。
static修飾的方法中,不可以使用非靜態(tài)內(nèi)容($this)。
在類(lèi)中調(diào)用屬性,使用self::屬性名
在類(lèi)外調(diào)用屬性,使用類(lèi)名::屬性名
<?php
class $A
{
public static name="zhangsan";
public static function aaa()
{
echo "aaaaaaaaaaaaaaaaa\n";
}
}
//靜態(tài)方法,不用實(shí)例化,使用類(lèi)名加雙冒號(hào)調(diào)用
echo A::aaa();
echo A::name;
A::name="lsi";//修改靜態(tài)屬性
- const
在類(lèi)中修飾成員屬性,將其定義成常量屬性(不可修改)
一般要求常量名都是大寫(xiě)的,沒(méi)有"$"符,沒(méi)有其他修飾符(public)
定義格式:const 成員常用量="值";
在類(lèi)中調(diào)用屬性,使用self::屬性名
在類(lèi)外調(diào)用屬性,使用類(lèi)名::屬性名
<?php
class Game
{
const UP =37;
const RIGHT=38;
const DOWN=39;
const LEFT=40;
public function move ($c)
{
switch($c)
{
case 37:echo "向上移動(dòng)。。。\n";
case 38:echo "向右移動(dòng)。。。\n";
case 39:echo "向下移動(dòng)。。。\n";
case 40:echo "向左移動(dòng)。。。\n";
}
}
}
$g=new Game();
$g->move(37);
$g->move(Game::up);
4.檢測(cè)當(dāng)前對(duì)象是否是屬性指定的類(lèi)
instanceof 用于確定一個(gè)PHP變量是否屬于某一類(lèi)class的實(shí)例:
如果對(duì)象數(shù)據(jù)該類(lèi)或該類(lèi)是此對(duì)象的父類(lèi)則返回 TRUE
類(lèi)型約束
<?php
class A
{
public function fun()
{
echo "aaaaaaaaaaaaaa\n";
}
}
class B extends A
{
public function fun()
{
echo "bbbbbbbbbbbbbbbbbbbbbbb\n";
}
}
class Demo
{
public function test(A $a)
{
$a->fun();
}
}
$demo=new Demo();
$demo->test(new A());
$demo->test(new B);
魔術(shù)方法
- clone
__clone();//魔術(shù)方法
當(dāng)執(zhí)行clone科隆時(shí)
- __toString
必須返回一個(gè)字符串
<?php
class A
{
public $name= "zhangsan ";
public function __toString()
{
return "name".$this->name."\n";
}
}
- __atuoload()
當(dāng)new實(shí)例化一個(gè)對(duì)象時(shí),這個(gè)類(lèi)若不存在,則自動(dòng)調(diào)用此函數(shù),并將類(lèi)名存入?yún)?shù)可以使用這個(gè)實(shí)現(xiàn)類(lèi)的自動(dòng)加載。
<?php
function __autoload($className)
{
$fname=$calssName.".php";
if(file_exists($fname))
{
require($fname);
}
}
$s= new Stu("wangwu",20);
echo $s."\n";
對(duì)象序列化(串行化)(在對(duì)象持久化存儲(chǔ)和傳輸中使用)
抽象類(lèi)
<?php
//抽象類(lèi)
abstract class A
{
public function fun1()
{
echo "fun1()....\n";
}
public function fun2()
{
echo "fun2().....\n";
}
//抽象方法,沒(méi)有方法體
public abstract function fun3();
}
class B extends A
{
public function fun3()
{
echo "fun3()...\n";
}
}
//接口
interface C
{
public function fun4();
public function fun5();
public function fun6();
}
//沒(méi)有完全實(shí)現(xiàn)C類(lèi),不能實(shí)現(xiàn)
abstract class D extends implements C
{
public function fun4()
{
echo "fun4()....\n";
}
public function fun5()
{
echo "fun5().....\n";
}
}
class E extends D
{
public function fun6()
{
echo "fun6()........\n";
}
}
$b= new B();
$b->fun1();
$b->fun2();
$b->fun3();
$c=new C();
$c->fun4();
$c->fun5();
$C->fun6();
多態(tài)
對(duì)于同一個(gè)方法,傳入不同對(duì)象,實(shí)現(xiàn)了不同的效果。
需要使用的技術(shù):繼承或?qū)崿F(xiàn),方法的覆蓋。
命名空間
<?php
namespace aa;
function strlen($s)
{
return 1000;
}
echo strlen("11")."\n";//調(diào)用當(dāng)前空間下的函數(shù)
echo \strlen("adc")."\n";//調(diào)用根空間下的函數(shù)strlen()(系統(tǒng)函數(shù))
echo \aa\strlen("123")."\n";//指定絕對(duì)路徑找到當(dāng)前空間下的函數(shù)