1. 程式人生 > >面向對象知識點續及單例模式

面向對象知識點續及單例模式

oar struct 分享 操作方法 col all 自動 style 構造方法

1、命名空間

命名空間的作用是避免了項目越來越大出現的命名沖突和混亂的問題

命名空間一般與文件的目錄相對應,第一個命名空間前面不能有任何代碼

在不同空間之間不可以直接調用其它元素,需要使用命名空間的語法:

<?php
namespace Article;

class Comment { }

namespace MessageBoard;

class Comment { }

//調用當前空間(MessageBoard)的Comment類
$comment = new Comment();

//調用Article空間的Comment類
$article_comment = new \Article\Comment();
?>
可以看到,在MessageBoard空間中調用article空間裏的Comment類時,使用了一種像文件路徑的語法: \空間名\元素名,除了類之外,對函數和常量的用法是一樣的

2、自動加載

最早的php項目都是通過手工include或者require來載入依賴的文件的,當項目變大時,一個文件要依賴很多個php類,就需要寫幾十行require或者include語句,這會導致管理很不方便,也會導致一些錯誤。比如某個類刪除了,但是require這個文件的語句沒有去掉,會報一個致命錯誤。這時候可以采用類自動載入的方式處理這種類依賴關系。

<?php
spl_autoload_register(
function ($class_name) { require_once $class_name . ‘.php‘; }); $obj = new MyClass1(); $obj2 = new MyClass2(); ?>

之前用的是__autoload() 函數,已經被廢棄

3、鏈式查詢

現在大多數框架都支持鏈式查詢,其原理很簡單:每個鏈式操作方法最後都返回當前對象

以下是示例文件:

 //database.php
function where($where)
    {
        return $this;
    }

    function order($order
) { return $this; } function limit($limit) { return $this; }

這樣便可持續調用了下一個方法了。

$db=new IMooc\Database();
$db->where("id>20")->order(‘create_time desc‘)->limit(10);

4、魔術方法

4.1、__get、__set方法,將對象的屬性進行接管

一般來說,總是把類的屬性定義為private,這更符合現實的邏輯

但是在類外調用一個未定義或者私有的屬性會報錯,便可以通過__get、__set方法獲取和賦值其屬性

$object=new IMooc\Object();
$object->name=‘zhangsan‘;
echo $object->name;
<?php
namespace IMooc;

class Object
{

    private $name=‘lisi‘;
    function __set($key, $value)
    {
        $this->$key = $value;
    }

    function __get($key)
    {
        return $this->$key;
    }
}

4.2、__call、__callStatic ,控制類的方法

方法不存在時自動調用,可在報錯時使用,保證代碼的健壯性

5、單例模式

有些類只需要實例化一次,像數據庫連接類,實例化多次的話會浪費資源,這時候就會用到單例模式

簡單的來說是“三私一公”:

構造方法私有化後就不能從外部實例化類了,但是怎麽實例化呢?

就要用到靜態方法了,將其公有化,便可在外部實例化類了,

在方法裏判斷對象是否為空,如果為空就實例化,存在就直接將它返回,這樣便實現了只實例化一次了

<?php
namespace IMooc;

class Database
{
   //私有化內部實例化的對象
    private static $instance = null;
   //私有化構造方法,禁止外部實例化
    private function __construct(){}
    //私有化__clone,防止被克隆
    private function __clone(){}
    // 公有靜態實例方法
    public static function getInstance(){
       if(!empty(self::$instance)){
           return self::$instance;
       }else{
           self::$instance=new Database();
           return self::$instance;
       }
    }
}

$obj1=Database::getInstance();
$obj2=Database::getInstance();
$obj3=Database::getInstance();
var_dump($obj1,$obj2,$obj3);
echo $obj1==$obj2?1:0;
echo "<br>";
echo $obj1==$obj3?1:0;

打印結果如下:

技術分享

面向對象知識點續及單例模式