php是不是面向对象编程,PHP面向对象编程入门
1、常用術(shù)語(yǔ)說(shuō)明
class 類
object 對(duì)象
new 實(shí)例化
member 類成員
method 方法,成員函數(shù)
property 屬性,成員變量
constant 類常量
2、類的構(gòu)造
class ClassName{ //class關(guān)鍵字加類名
//類中只能有三種成員:屬性、類常量、方法,不限數(shù)量
//成員變量(屬性)
public $var; //普通屬性,只能通過(guò)對(duì)象訪問(wèn),聲明時(shí)必須使用訪問(wèn)控制修飾符
public static $s_var = 0; //靜態(tài)屬性,使用static關(guān)鍵字修飾的屬性
const PI = 3.14; //類常量,聲明時(shí)必須使用const關(guān)鍵字修飾并賦值,其值不可修改
//成員方法
function fn0(){
//普通成員方法
echo '普通成員方法運(yùn)行了
';
}
static function fn1(){
//靜態(tài)方法
echo self::$s_var.'靜態(tài)方法運(yùn)行了
'; //類似$this,在類內(nèi)部使用self關(guān)鍵字代表當(dāng)前類名
}
public function __construct($var){
//構(gòu)造方法,對(duì)象實(shí)例化時(shí)自動(dòng)調(diào)用該方法
$this->var = $var; //$this表示當(dāng)前對(duì)象
echo '構(gòu)造方法運(yùn)行了
';
}
public function __destruct(){
//析構(gòu)方法,對(duì)象銷毀時(shí)自動(dòng)調(diào)用該方法
echo '析構(gòu)方法運(yùn)行了
';
}
public function __clone(){
//克隆方法,克隆對(duì)象時(shí)自動(dòng)調(diào)用該方法
echo '克隆方法運(yùn)行了
';
}
}
$c = new ClassName('test'); //對(duì)象實(shí)例化
echo $c->var.'
'; //訪問(wèn)對(duì)象屬性$obj->var
$c->var = 'update'; //修改對(duì)象屬性
$c->new_var = 'add'; //新增對(duì)象屬性
var_dump($c);echo '
';
unset($c->new_var); //刪除對(duì)象屬性
var_dump($c);echo '
';
$c->fn0(); //調(diào)用成員方法
echo ClassName::PI.'
'; //訪問(wèn)類常量,使用:類名::類常量名
echo ClassName::$s_var.'
'; //訪問(wèn)靜態(tài)屬性,使用:類名::$靜態(tài)屬性名
ClassName::fn1(); //調(diào)用靜態(tài)方法
3、成員修飾符
3.1、關(guān)鍵字:
類常量,不可修改性const(修飾屬性),類常量只能通過(guò)類訪問(wèn):類名加范圍解析操作符(雙冒號(hào)::)
靜態(tài)成員-static(修飾屬性和方法),靜態(tài)成員只能通過(guò)類訪問(wèn)
不可繼承性final(修飾類和方法)
3.2、訪問(wèn)控制符
public:表示公有的,其修飾的屬性和方法可以在類內(nèi)和類外訪問(wèn),可以被繼承
protected:表示受保護(hù)的,,其修飾的屬性和方法只可以在類內(nèi)訪問(wèn),可以被繼承
privated:表示私有的,其修飾的屬性和方法只可以在類內(nèi)訪問(wèn),不可以被繼承
屬性前一定要加一個(gè)訪問(wèn)控制修飾符,類常量不用加訪問(wèn)控制修飾符,方法前可以不加訪問(wèn)控制修飾符,默認(rèn)是public
4、對(duì)象值傳遞
對(duì)象的賦值操作是引用賦值,即:當(dāng)將對(duì)象a的值賦值給對(duì)象b時(shí),a和b指向內(nèi)存中同一個(gè)地址
如果需要實(shí)現(xiàn)真正的復(fù)制,可以使用對(duì)象克隆方法:$b = clone $a;
私有化__clone方法可以禁止對(duì)象被克隆:private function __clone(){}
5、類的加載
類的訪問(wèn)必須保證類在內(nèi)存中已經(jīng)存在,所有在使用類之前需要將包含類的PHP文件加載到內(nèi)存,本質(zhì)是文件加載。
手動(dòng)加載:
if(!class_exists('Man')){
//類不存在,加載
include_once 'Man.php';
}
new Man();
自動(dòng)加載:
php7以前:
function __autoload($class_name){
//假設(shè)有多個(gè)類放在多個(gè)文件夾中
//先嘗試去a文件夾中尋找類
$file = 'a/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
exit;
}
//再嘗試去b文件夾中尋找類
$file = 'b/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
exit;
}
//以此類推,直到找到類或找完所有包含類的文件夾為止
}
$d = new Dog(); //實(shí)例化Dog類,系統(tǒng)自動(dòng)調(diào)用__autoload函數(shù)
php7以后:
function my_autoload($class_name){
$file = 'a/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
exit;
}
$file = 'b/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
exit;
}
}
spl_autoload_register('my_autoload');
$d = new Dog();
也可以分開(kāi)多個(gè)加載函數(shù):
function a_autoload($class_name){
$file = 'a/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
}
}
function b_autoload($class_name){
$file = 'b/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
}
}
spl_autoload_register('a_autoload');
spl_autoload_register('b_autoload');
$d = new Dog();
自動(dòng)加載類:
class Autoload{
public static function loadA($class_name){
$file = 'a/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
}
}
public static function loadB($class_name){
$file = 'b/'.$class_name.'.class.php';
if(file_exists($file)){
include_once $file;
}
}
}
spl_autoload_register(array('Autoload','loadA'));
spl_autoload_register(array('Autoload','loadB'));
$d = new Dog();
6、設(shè)計(jì)模式
單例模式:一個(gè)類有且僅有一個(gè)對(duì)象,例如操作系統(tǒng)中的資源管理器,目的是為了保護(hù)資源的唯一性
class Singleton{
//使用一個(gè)靜態(tài)屬性保存生產(chǎn)出來(lái)的對(duì)象
private static $object = NULL;
//私有化構(gòu)造方法
private function __construct(){}
//類入口
public static function getInstance(){
if(!(self::$object instanceof self)){
self::$object = new self();
}
return self::$object;
}
//私有化克隆方法,防止克隆產(chǎn)生新對(duì)象
private function __clone(){}
}
//實(shí)例化兩個(gè)對(duì)象
$s = Singleton::getInstance();
$s1 = Singleton::getInstance();
var_dump($s,$s1); //檢測(cè)到是同一個(gè)對(duì)象
工廠模式factory:
由一個(gè)地方生產(chǎn)對(duì)象,其他位置就不需要額外實(shí)例化對(duì)象,從而可以方便后期代碼統(tǒng)一維護(hù)(改名),方便隱藏真實(shí)的類結(jié)構(gòu)。
工廠模式針對(duì)相似模型的統(tǒng)一產(chǎn)出,要有一批具有類似功能的類,其本質(zhì)是相似的大類下的小類
靜態(tài)工廠(生產(chǎn)對(duì)象時(shí)需要知道類名):
class Man{
public function display(){
echo 'Man
';
}
}
class Woman{
public function display(){
echo 'Woman
';
}
}
class Child{
public function display(){
echo 'Child
';
}
}
class HumanFactory{
public static function getInstance($class_name){
return new $class_name();
}
}
$m = HumanFactory::getInstance('Man');
$w = HumanFactory::getInstance('Woman');
$c = HumanFactory::getInstance('Child');
$m->display();
$w->display();
$c->display();
匿名工廠(生產(chǎn)對(duì)象時(shí)需要知道類名對(duì)應(yīng)的符號(hào)):
class HumanFactory{
public static function getInstance($flag){
switch ($flag) {
case 'm':
return new Man();
case 'w':
return new Woman();
case 'c':
return new Child();
default:
return null;
}
}
}
$m = HumanFactory::getInstance('m');
$w = HumanFactory::getInstance('w');
$c = HumanFactory::getInstance('c');
標(biāo)簽:function,入門(mén),public,file,var,PHP,class,面向?qū)ο缶幊?name
來(lái)源: https://www.cnblogs.com/chuanzi/p/10380555.html
總結(jié)
以上是生活随笔為你收集整理的php是不是面向对象编程,PHP面向对象编程入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JDBC自定义框架
- 下一篇: 用宝塔本地搭建php,Windows系统