速戰速決 (4) - PHP: 類基礎, 抽象類, 介面, trait

来源:http://www.cnblogs.com/webabcd/archive/2016/05/05/5462589.html
-Advertisement-
Play Games

[源碼下載] 速戰速決 (4) - PHP: 類基礎, 抽象類, 介面, trait 作者:webabcd介紹速戰速決 之 PHP 類基礎 抽象類 介面 trait 示例1、類的相關知識點 1(基礎)class/class1.php 2、類的相關知識點 2(抽象類,介面,trait)class/cl ...


[源碼下載]


速戰速決 (4) - PHP: 類基礎, 抽象類, 介面, trait



作者:webabcd


介紹
速戰速決 之 PHP

  • 類基礎
  • 抽象類
  • 介面
  • trait



示例
1、類的相關知識點 1(基礎)
class/class1.php

<?php
/**
 * 類的相關知識點 1(基礎)
 *
 * 規範:命名空間與目錄路徑對應,類名與文件名對應,文件以 .class.php 為尾碼名
 */

class MyClass1
{
    // 類常量,沒有“$”符號,不能被覆蓋
    const MyConstant = 'constant value';
    // 靜態屬性
    static $myStaticProperty = "static property";

    // 對於屬性和方法的訪問控制有 private protected public(預設值)
    private $_name;
    private $_age;

    // 構造函數
    // PHP 中的魔術方法(magic method)均以 __(兩個下劃線)開頭(類似的還有 __destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state() 和 __clone() 等)
    function __construct()
    {
        echo "MyClass1 construct";
        echo "<br />";

        // 獲取參數個數
        $args_num = func_num_args();

        if ($args_num == 1)
        {
            // $this 代表當前對象,是指向類實例的指針
            $this->_name = func_get_arg(0);
        }
        else if ($args_num == 2)
        {
            $this->_name = func_get_arg(0);
            $this->_age = func_get_arg(1);
        }
        else
        {

        }
    }

    // 析構函數
    function __destruct()
    {
        print "MyClass1 destruct";
        echo "<br />";
    }

    // 構造函數,此種方式在 PHP 5.3.3 或以上可支持
    // 此種方式的構造函數也可以當做方法被調用
    public function MyClass1()
    {
        echo "i am not a construct, i am a method";
    }

    // 靜態方法
    public static function myStaticMethod()
    {
        return "static method";
    }

    // 方法
    public function getInfo()
    {
        // $this 代表當前對象,是指向類實例的指針
        return "name: " . $this->_name . ", age: " . $this->_age;
    }

    // 不直接支持方法的重載(overload),可以通過相關的魔術方法來實現(參見:class3.php)
    // public function getInfo($name) { }

    // 帶參數類型約束的方法,類型約束不能用於 int 或 string 之類的標量類型
    // 本例約束了參數 $ary 必須是 array 類型
    public function getFirst(array $ary)
    {
        return $ary[0];
    }
}

// 被聲明為 final 的類或屬性或方法,無法繼承
// 只能繼承一個類
final class MyClass2 extends MyClass1
{
    // 構造函數可以為參數設置預設值(方法或函數也可以為參數設置預設值)
    function __construct($name = "wanglei", $age = 100)
    {
        echo "MyClass2 construct";
        echo "<br />";

        // parent 代表當前類的基類
        parent::__construct($name, $age);

        // self 代表當前類
        // $this 代表當前對象,是指向類實例的指針
    }

    // 析構函數
    function __destruct()
    {
        print "MyClass2 destruct";
        echo "<br />";

        parent::__destruct();
    }

    // 覆蓋基類的同名方法(override)
    public function getInfo()
    {
        // $this 代表當前對象,指向類實例的指針
        return "MyClass2 - " . parent::getInfo();
    }
}

// 類的實例化
$objClass1 = new MyClass1("webabcd", 35);
// 通過 -> 調用實例方法或實例屬性
echo $objClass1->getInfo();
echo "<br />";
// 通過 -> 調用實例方法或實例屬性(MyClass1() 是構造函數,也可以當做方法被調用)
echo $objClass1->MyClass1();
echo "<br />";

$objClass2 = new MyClass2();
echo $objClass2->getInfo();
echo "<br />";

// instanceof - 用於判斷一個對象是否是指定類的實例
if($objClass2 instanceof MyClass1)
{
    echo '$objClass2 instanceof MyClass1';
    echo "<br />";
}

// 通過 :: 調用類常量或靜態屬性或靜態方法
echo MyClass1::MyConstant;
echo "<br />";

// 通過 :: 調用類常量或靜態屬性或靜態方法
echo MyClass1::$myStaticProperty;
echo "<br />";

// variable class(可變類),將變數的值作為類名
$className = 'MyClass1';
// variable method(可變方法),將變數的值作為方法名
$methodName = 'myStaticMethod';
// 通過 :: 調用類常量或靜態屬性或靜態方法
echo $className::$methodName();
echo "<br />";

// 調用帶參數類型約束的方法
echo $objClass1->getFirst(array("a", "b", "c"));
echo "<br />";


2、類的相關知識點 2(抽象類,介面,trait)
class/class2.php

<?php
/**
 * 類的相關知識點 2(抽象類,介面,trait)
 */

// 抽象類
abstract class MyAbstractClass
{
    // 抽象方法,子類必須定義這些方法
    abstract protected function getValue1();
    abstract public function getValue2($param1);

    // 普通方法(非抽象方法)
    public function getValue0()
    {
        return "getValue0";
    }
}

// 介面
interface MyInterface1
{
    // 介面常量,不能被覆蓋
    const MyConstant = 'constant value';
    public function getValue3();
}

// 介面
interface MyInterface2 extends MyInterface1
{
    public function getValue4();
}

// 介面
interface MyInterface3
{
    public function getValue5();
}

// trait(可以 use 多個,允許有實現代碼,但是本身不能實例化)
trait MyTrait1
{
    // 可以具有方法,靜態方法,屬性等
    function getValue6()
    {
        return "getValue6";
    }
}

// trait(可以 use 多個,允許有實現代碼,但是本身不能實例化)
trait MyTrait2
{
    // 抽象方法(use 這個 trait 的類必須要定義這個方法)
    abstract function getValue7();
}

// trait(可以 use 多個,允許有實現代碼,但是本身不能實例化)
trait MyTrait3
{
    function getValue6()
    {
        return "getValue6";
    }

    function getValue8()
    {
        return "getValue8";
    }
}

// 必須實現所有抽象方法和介面方法
// 類只能單繼承,介面可以多繼承
class MyClass1 extends MyAbstractClass implements MyInterface2, MyInterface3
{
    // 可以 use 多個 trait
    use MyTrait1, MyTrait2;
    use MyTrait3
    {
        // 多 trait 間有重名的,可以指定以哪個為準
        MyTrait1::getValue6 insteadof MyTrait3;
        // 可以為 trait 的指定方法設置別名(調用的時候用方法名也行,用別名也行)
        MyTrait3::getValue8 as alias;
    }

    // 可以將 protected 升級為 public
    public function getValue1()
    {
        return "getValue1";
    }

    // 可以加參數,但是加的參數必須要有預設值
    public function getValue2($param1, $param2 = 'param2')
    {
        return "getValue2, {$param1}, {$param2}";
    }

    public function getValue3()
    {
        return "getValue3";
    }

    public function getValue4()
    {
        return "getValue4";
    }

    public function getValue5()
    {
        return "getValue5";
    }

    public function getValue7()
    {
        return "getValue7";
    }
}

// 調用介面常量
echo MyInterface1::MyConstant;
echo "<br />";

$myClass1 = new MyClass1;
echo $myClass1->getValue0();
echo "<br />";
echo $myClass1->getValue1();
echo "<br />";
echo $myClass1->getValue2("webabcd");
echo "<br />";
echo $myClass1->getValue3();
echo "<br />";
echo $myClass1->getValue4();
echo "<br />";
echo $myClass1->getValue5();
echo "<br />";
echo $myClass1->getValue6();
echo "<br />";
echo $myClass1->getValue7();
echo "<br />";
echo $myClass1->getValue8();
echo "<br />";
echo $myClass1->alias();
echo "<br />";



OK
[源碼下載]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 網路通信的步驟, 1.找到對方的ip 2.數據發送到對方指定的應用程式上,為了標識這些應用程式,用數字進行標識,這個數字就是埠 3.定義通信規則,這個規則就稱為協議 國際組織定義了通用協議 TCP/IP 網路模型 OSI參考模型 網路分成7層,應用層 ==> 表示層 ==> 會話層 ==> 傳輸層 ...
  • 今天我們來介紹一下C語言操作資料庫的方法,這裡我們使用的是ODBC方式。環境是WIN7+VC6。其他環境也差不多,具體情況具體分析。 首先是環境的配置以及數據源的添加。這裡就不去解釋了,相關資料網上有很多。需要註意的是這裡不可以直接使用控制面板中的ODBC,我們需要打開C:\Windows\SysW ...
  • import java.util.ArrayList;import java.util.Scanner; /* * 題目描述: * 讀入數據string[ ],然後讀入一個短字元串。要求查找string[ ]中和短字元串的所有匹配,輸出行號、匹配字元串。 * 匹配時不區分大小寫,並且可以有一個用中括 ...
  • 全文純手打,不喜勿噴~ OOP封裝 //封裝一個類:用來管理普通人的特性和行為 //1、類的概念:人類在認識客觀世界時,發現某些事物具有共同特性,共同結構,共同行為。 // 為了方便,我們就將它們集合起來,並抽象出一個概念類管理它們,這個概念就是類。 //2、類的組成:標準類由:實例變數、構造器、設 ...
  • 一、遞歸函數 概念:遞歸演算法是一種直接或者間接的調用自身演算法的過程。在電腦編寫程式中,遞歸演算法對解決一大類問題是十分有效的。 特點: ①遞歸就是在過程或者函數里調用自身。 ②在使用遞歸策略時,必須有一個明確的遞歸條件,稱為遞歸出口。 ③遞歸演算法解題通常顯得很簡潔,但遞歸演算法解題的效率較低。所以一般 ...
  • 問題? Java7新增了關於文件屬性信息的一些新特性,通過java.nio.file.*包下麵的類可以實現設置或者讀取文件的元數據信息(比如最後修改時間,創建時間,文件大小,是否為目錄等等)。尤其是UserDefinedFileAttributeView,可以用來自定義文件的元數據信息。於是在自己的 ...
  • 1. 初識解釋器ghci 1.1 查看幫助: :? 1.2 修改提示符: :set prompt ghci>>> 1.3 加自己指定模塊: :module + Data.Ratio 2. 基本交互 2.1 基本算術運算 中綴表達式: 首碼表達式: 2.2 算術中的負數 -8其實並不是直接表示負數8, ...
  • 實現界面 涉及到四張表,type(商品類型表),type_spec(商品類型規格關聯表),attribute(商品屬性表),attribute_value(商品屬性值表) 新建基控制器BaseController.class.php,向上抽取出來的公用方法 BaseController.class. ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...