1. 程式人生 > >php基礎學習-1

php基礎學習-1

1.PHP 變數規則:

  • 變數以 $ 符號開始,後面跟著變數的名稱
  • 變數名必須以字母或者下劃線字元開始
  • 變數名只能包含字母數字字元以及下劃線(A-z、0-9 和 _ )
  • 變數名不能包含空格
  • 變數名是區分大小寫的($y 和 $Y 是兩個不同的變數)

例:

<?php

$txt="Hello world!";

$x=5;

?>

2.php變數作用域

變數的作用域是指令碼中變數可被引用/使用的部分。

PHP 有四種不同的變數作用域:

  • local
  • global(在一個函式中訪問一個全域性變數,需要使用 global 關鍵字)
  • static(當一個函式完成時,它的所有變數通常都會被刪除。然而,有時候您希望某個區域性變數不要被刪除。要做到這一點,請在您第一次宣告變數時使用 static 關鍵字)
  • parameter(數是通過呼叫程式碼將值傳遞給函式的區域性變數,引數是在引數列表中宣告的,作為函式宣告的一部分)

3.EOF

PHP EOF(heredoc)是一種在命令列shell(如sh、csh、ksh、bash、PowerShell和zsh)和程式語言(像Perl、PHP、Python和Ruby)裡定義一個字串的方法。

使用概述:

  • 1. 必須後接分號,否則編譯通不過。
  • 2. EOF
    可以用任意其它字元代替,只需保證結束標識與開始標識一致。
  • 3. 結束標識必須頂格獨自佔一行(即必須從行首開始,前後不能銜接任何空白和字元)。
  • 4. 開始標識可以不帶引號或帶單雙引號,不帶引號與帶雙引號效果一致,解釋內嵌的變數和轉義符號,帶單引號則不解釋內嵌的變數和轉義符號。
  • 5. 當內容需要內嵌引號(單引號或雙引號)時,不需要加轉義符,本身對單雙引號轉義,此處相當與q和qq的用法。

<?php

header("content-type:text/html;charset=gbk");
$name="變數會被解析";
$a=<<<EOF
$name<br><a>html格式會被解析</a><br/>雙引號和Html格式外的其他內容都不會被解析
"雙引號外所有被排列好的格式都會被保留"
"但是雙引號內會保留轉義符的轉義效果,比如table:\t和換行:\n下一行"
EOF;
echo $a;

?>

4.資料型別

String(字串), Integer(整型),Float(浮點型),
Boolean(布林型),NULL(空值),

Array(陣列):

$cars=array("Volvo","BMW","Toyota");

Object(物件):

<?php
class Car
{
    var $color;
    function __construct($color="green") {
        $this->color = $color;
    }
    function what_color() {
        return $this->color;
    }
}

function print_vars($obj) {
    foreach (get_object_vars($obj) as $prop => $val) {
        echo "\t$prop = $val\n";
    }
}

// 例項一個物件
$herbie = new Car("white");

// 顯示 herbie 屬性
echo "\therbie: Properties\n";
print_vars($herbie);
?>

5.常量

設定常量,使用 define() 函式,

常量在定義後,預設是全域性變數,可以在整個執行的指令碼的任何地方使用。

以下例項演示了在函式內使用常量,即便常量定義在函式外也可以正常使用常量。

函式語法如下:

bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )

該函式有三個引數:

  • name:必選引數,常量名稱,即標誌符。
  • value:必選引數,常量的值。
  • case_insensitive :可選引數,如果設定為 TRUE,該常量則大小寫不敏感。預設是大小寫敏感的。

<?php

// 不區分大小寫的常量名

define("GREETING", "歡迎訪問", true);

echo greeting;

// 輸出 "歡迎訪問 " ?>

6.字串變數

並置運算子 (.) 用於把兩個字串值連線起來。

<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>

strlen() 函式返回字串的長度(字元數)。

<?php
echo strlen("Hello world!");
?>

strpos() 函式用於在字串內查詢一個字元或一段指定的文字。

<?php
echo strpos("Hello world!","world");
?>

7.陣列

遍歷陣列:

<?php

$cars=array("Volvo","BMW","Toyota");

 $arrlength=count($cars);

for($x=0;$x<$arrlength;$x++) {

echo $cars[$x];

echo "<br>";

}

?>

指定鍵值,並遍歷

<?php

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

foreach($age as $x=>$x_value) {

echo "Key=" . $x . ", Value=" . $x_value; echo "<br>";

}

?>

8.陣列排序

  • sort() - 對陣列進行升序排列
  • rsort() - 對陣列進行降序排列
  • asort() - 根據關聯陣列的值,對陣列進行升序排列
  • ksort() - 根據關聯陣列的鍵,對陣列進行升序排列
  • arsort() - 根據關聯陣列的值,對陣列進行降序排列
  • krsort() - 根據關聯陣列的鍵,對陣列進行降序排列

9.超級變數

PHP 超級全域性變數列表:

  • $GLOBALS($GLOBALS 是PHP的一個超級全域性變數組,在一個PHP指令碼的全部作用域中都可以訪問。$GLOBALS 是一個包含了全部變數的全域性組合陣列。變數的名字就是陣列的鍵。)
  • $_SERVER($_SERVER 是一個包含了諸如頭資訊(header)、路徑(path)、以及指令碼位置(script locations)等等資訊的陣列。這個陣列中的專案由 Web 伺服器建立。不能保證每個伺服器都提供全部專案;伺服器可能會忽略一些,或者提供一些沒有在這裡列舉出來的專案。)

下表列出了所有 $_SERVER 變數中的重要元素:

元素/程式碼 描述
$_SERVER['PHP_SELF'] 當前執行指令碼的檔名,與 document root 有關。例如,在地址為 http://example.com/test.php/foo.bar 的指令碼中使用 $_SERVER['PHP_SELF'] 將得到 /test.php/foo.bar。__FILE__ 常量包含當前(例如包含)檔案的完整路徑和檔名。 從 PHP 4.3.0 版本開始,如果 PHP 以命令列模式執行,這個變數將包含指令碼名。之前的版本該變數不可用。
$_SERVER['GATEWAY_INTERFACE'] 伺服器使用的 CGI 規範的版本;例如,"CGI/1.1"。
$_SERVER['SERVER_ADDR'] 當前執行指令碼所在的伺服器的 IP 地址。
$_SERVER['SERVER_NAME'] 當前執行指令碼所在的伺服器的主機名。如果指令碼運行於虛擬主機中,該名稱是由那個虛擬主機所設定的值決定。(如: www.runoob.com)
$_SERVER['SERVER_SOFTWARE'] 伺服器標識字串,在響應請求時的頭資訊中給出。 (如:Apache/2.2.24)
$_SERVER['SERVER_PROTOCOL'] 請求頁面時通訊協議的名稱和版本。例如,"HTTP/1.0"。
$_SERVER['REQUEST_METHOD'] 訪問頁面使用的請求方法;例如,"GET", "HEAD","POST","PUT"。
$_SERVER['REQUEST_TIME'] 請求開始時的時間戳。從 PHP 5.1.0 起可用。 (如:1377687496)
$_SERVER['QUERY_STRING'] query string(查詢字串),如果有的話,通過它進行頁面訪問。
$_SERVER['HTTP_ACCEPT'] 當前請求頭中 Accept: 項的內容,如果存在的話。
$_SERVER['HTTP_ACCEPT_CHARSET'] 當前請求頭中 Accept-Charset: 項的內容,如果存在的話。例如:"iso-8859-1,*,utf-8"。
$_SERVER['HTTP_HOST'] 當前請求頭中 Host: 項的內容,如果存在的話。
$_SERVER['HTTP_REFERER'] 引導使用者代理到當前頁的前一頁的地址(如果存在)。由 user agent 設定決定。並不是所有的使用者代理都會設定該項,有的還提供了修改 HTTP_REFERER 的功能。簡言之,該值並不可信。)
$_SERVER['HTTPS'] 如果指令碼是通過 HTTPS 協議被訪問,則被設為一個非空的值。
$_SERVER['REMOTE_ADDR'] 瀏覽當前頁面的使用者的 IP 地址。
$_SERVER['REMOTE_HOST'] 瀏覽當前頁面的使用者的主機名。DNS 反向解析不依賴於使用者的 REMOTE_ADDR。
$_SERVER['REMOTE_PORT'] 使用者機器上連線到 Web 伺服器所使用的埠號。
$_SERVER['SCRIPT_FILENAME'] 當前執行指令碼的絕對路徑。
$_SERVER['SERVER_ADMIN'] 該值指明瞭 Apache 伺服器配置檔案中的 SERVER_ADMIN 引數。如果指令碼執行在一個虛擬主機上,則該值是那個虛擬主機的值。(如:[email protected])
$_SERVER['SERVER_PORT'] Web 伺服器使用的埠。預設值為 "80"。如果使用 SSL 安全連線,則這個值為使用者設定的 HTTP 埠。
$_SERVER['SERVER_SIGNATURE'] 包含了伺服器版本和虛擬主機名的字串。
$_SERVER['PATH_TRANSLATED'] 當前指令碼所在檔案系統(非文件根目錄)的基本路徑。這是在伺服器進行虛擬到真實路徑的映像後的結果。
$_SERVER['SCRIPT_NAME'] 包含當前指令碼的路徑。這在頁面需要指向自己時非常有用。__FILE__ 常量包含當前指令碼(例如包含檔案)的完整路徑和檔名。
$_SERVER['SCRIPT_URI'] URI 用來指定要訪問的頁面。例如 "/index.html"。
  • $_REQUEST($_REQUEST 用於收集HTML表單提交的資料。)

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php
$name = $_REQUEST['fname'];
echo $name;
?>

</body>
</html>

  • $_POST($_POST 被廣泛應用於收集表單資料,在HTML form標籤的指定該屬性:"method="post"。)

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php
$name = $_POST['fname'];
echo $name;
?>

</body>
</html>

  • $_GET
  • $_FILES
  • $_ENV
  • $_COOKIE
  • $_SESSION

10.while迴圈

while 迴圈將重複執行程式碼塊,直到指定的條件不成立。

while (條件)
{
    要執行的程式碼;
}

do...while 語句會至少執行一次程式碼,然後檢查條件,只要條件成立,就會重複進行迴圈。

do
{
    要執行的程式碼;
}
while (條件);

11.for迴圈

for 迴圈用於您預先知道指令碼需要執行的次數的情況。

for (初始值; 條件; 增量)
{
    要執行的程式碼;
}

foreach 迴圈用於遍歷陣列。

$x=array("one","two","three");
 foreach ($x as $value) { 
echo $value . "<br>";
 }

12.內建函式

  • 函式的名稱應該提示出它的功能
  • 函式名稱以字母或下劃線開頭(不能以數字開頭)

<?php

function writeName() {

echo "Kai Jim Refsnes";

}

echo "My name is ";

writeName();

?>

13.魔術變數

_line_檔案中的當前行號。

__file__當前檔案路徑

_dir_檔案所在的目錄。如果用在被包括檔案中,則返回被包括的檔案所在的目錄。

_FUNCTION_函式名稱

_class_類名稱

traits:PHP 實現了程式碼複用的一個方法,稱為 traits。

Trait 名包括其被宣告的作用區域(例如 Foo\Bar)。

從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優先順序是當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。

<?php

class Base {

public function sayHello() {

echo 'Hello ';

} }

trait SayWorld {

public function sayHello() {

parent::sayHello();

echo 'World!';

} }

class MyHelloWorld extends Base {

use SayWorld;

}

$o = new MyHelloWorld();

$o->sayHello(); ?>

多個 trait 的情況:

通過逗號分隔,在 use 宣告列出多個 trait,可以都插入到一個類中。示例程式碼如下:

<?php
trait Hello {
    public function sayHello() { 
        echo 'Hello ';    
    }
}
trait World {    
    public function sayWorld() {     
        echo 'World';  
    }
}
class MyHelloWorld { 
    use Hello, World;  
    public function sayExclamationMark() {   
        echo '!'; 
    }
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

__METHOD__:返回該方法被定義時的名字(區分大小寫)。

__namespace__:返回名稱空間名稱

14.名稱空間namespace

PHP 名稱空間可以解決以下兩類問題:

  1. 使用者編寫的程式碼與PHP內部的類/函式/常量或第三方類/函式/常量之間的名字衝突。
  2. 為很長的識別符號名稱(通常是為了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提高原始碼的可讀性。
<?php
namespace MyProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
}
?>

名稱空間的使用

  1. 非限定名稱,或不包含字首的類名稱。

  2. 限定名稱,或包含字首的名稱

  3. 完全限定名稱,或包含了全域性字首操作符的名稱

例:

index.php

<?php
namespace Foo\Bar\subnamespace;

const FOO = 1;
function foo() {
    echo("1");
    echo "<br>";
}
class foo
{
    static function staticmethod() {
        
    }
}
?>

index1.php

<?php
namespace Foo\Bar;
include 'index.php';

const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}

/* 非限定名稱 */
foo(); // 解析為函式 Foo\Bar\foo
foo::staticmethod(); // 解析為類 Foo\Bar\foo ,方法為 staticmethod
echo FOO; // 解析為常量 Foo\Bar\FOO
echo "<br>";

/* 限定名稱 */
subnamespace\foo(); // 解析為函式 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析為類 Foo\Bar\subnamespace\foo,
// 以及類的方法 staticmethod
echo subnamespace\FOO; // 解析為常量 Foo\Bar\subnamespace\FOO

/* 完全限定名稱 */
\Foo\Bar\foo(); // 解析為函式 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析為類 Foo\Bar\foo, 以及類的方法 staticmethod
echo \Foo\Bar\FOO; // 解析為常量 Foo\Bar\FOO
?>

名稱空間和動態語言特徵

PHP 名稱空間的實現受到其語言自身的動態特徵的影響。因此,如果要將下面的程式碼轉換到名稱空間中,動態訪問元素。

必須使用完全限定名稱(包括名稱空間字首的類名稱)。注意因為在動態的類名稱、函式名稱或常量名稱中,限定名稱和完全限定名稱沒有區別,因此其前導的反斜槓是不必要的。

動態訪問名稱空間的元素

<?php
namespace namespacename;
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "namespaced";

include 'example1.php';

$a = 'classname';
$obj = new $a; // 輸出 classname::__construct
$b = 'funcname';
$b(); // 輸出函式名
echo constant('constname'), "\n"; // 輸出 global

/* 如果使用雙引號,使用方法為 "\\namespacename\\classname"*/
$a = '\namespacename\classname';
$obj = new $a; // 輸出 namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // 輸出 namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // 輸出 namespacename\funcname
$b = '\namespacename\funcname';
$b(); // 輸出 namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // 輸出 namespaced
echo constant('namespacename\constname'), "\n"; // 輸出 namespaced
?>

15.面向物件

  • − 定義了一件事物的抽象特點。類的定義包含了資料的形式以及對資料的操作。

  • 物件 − 是類的例項。

  • 成員變數 − 定義在類內部的變數。該變數的值對外是不可見的,但是可以通過成員函式訪問,在類被例項化為物件後,該變數即可稱為物件的屬性。

  • 成員函式 − 定義在類的內部,可用於訪問物件的資料。

  • 繼承 − 繼承性是子類自動共享父類資料結構和方法的機制,這是類之間的一種關係。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並加入若干新的內容。

  • 父類 − 一個類被其他類繼承,可將該類稱為父類,或基類,或超類。

  • 子類 − 一個類繼承其他類稱為子類,也可稱為派生類。

  • 多型 − 多型性是指相同的函式或方法可作用於多種型別的物件上並獲得不同的結果。不同的物件,收到同一訊息可以產生不同的結果,這種現象稱為多型性。

  • 過載 − 簡單說,就是函式或者方法有同樣的名稱,但是引數列表不相同的情形,這樣的同名不同引數的函式或者方法之間,互相稱之為過載函式或者方法。

  • 抽象性 − 抽象性是指將具有一致的資料結構(屬性)和行為(操作)的物件抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的應用有關。

  • 封裝 − 封裝是指將現實世界中存在的某個客體的屬性與行為繫結在一起,並放置在一個邏輯單元內。

  • 建構函式 − 主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。

  • 解構函式 − 解構函式(destructor) 與建構函式相反,當物件結束其生命週期時(例如物件所在的函式已呼叫完畢),系統自動執行解構函式。解構函式往往用來做"清理善後" 的工作(例如在建立物件時用new開闢了一片記憶體空間,應在退出前在解構函式中用delete釋放)。

類定義:

  • 類使用 class 關鍵字後加上類名定義。

  • 類名後的一對大括號({})內可以定義變數和方法。

  • 類的變數使用 var 來宣告, 變數也可以初始化值。

  • 函式定義類似 PHP 函式的定義,但函式只能通過該類及其例項化的物件訪問。

<?php
class phpClass {
  var $var1;
  var $var2 = "constant string";
  
  function myfunc ($arg1, $arg2) {
     [..]
  }
  [..]
}
?>

建立物件:

$runoob = new Site;
$taobao = new Site;
$google = new Site;
// 呼叫成員函式,設定標題和URL
$runoob->setTitle( "菜鳥教程" );
$taobao->setTitle( "淘寶" );
$google->setTitle( "Google 搜尋" );

$runoob->setUrl( 'www.runoob.com' );
$taobao->setUrl( 'www.taobao.com' );
$google->setUrl( 'www.google.com' );

// 呼叫成員函式,獲取標題和URL
$runoob->getTitle();
$taobao->getTitle();
$google->getTitle();

$runoob->getUrl();
$taobao->getUrl();
$google->getUrl();

建構函式:
建構函式是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,在建立物件的語句中與 new 運算子一起使用

void __construct ([ mixed $args [, $... ]] )

折構函式:

解構函式(destructor) 與建構函式相反,當物件結束其生命週期時(例如物件所在的函式已呼叫完畢),系統自動執行解構函式。

void __destruct ( void )

繼承:

PHP 使用關鍵字 extends 來繼承一個類,PHP 不支援多繼承,格式如下:

class Child extends Parent {
   // 程式碼部分
}

控制訪問:

PHP 對屬性或方法的訪問控制,是通過在前面新增關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。

  • public(公有):公有的類成員可以在任何地方被訪問。
  • protected(受保護):受保護的類成員則可以被其自身以及其子類和父類訪問。
  • private(私有):私有的類成員則只能被其定義所在的類訪問。

<?php
/**
 * Define MyClass
 */
class MyClass
{
    // 宣告一個公有的建構函式
    public function __construct() { }
    
    // 宣告一個公有的方法
    public function MyPublic() {
        echo("is public method");
    }
    
    // 宣告一個受保護的方法
    protected function MyProtected() {
        echo("is protected method");
    }
    
    // 宣告一個私有的方法
    private function MyPrivate() {
        echo("is private method");
    }
    
    // 此方法為公有
    function Foo()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }
}

$myclass = new MyClass;
$myclass->MyPublic(); // 這行能被正常執行
//$myclass->MyProtected(); // 這行會產生一個致命錯誤
//$myclass->MyPrivate(); // 這行會產生一個致命錯誤
$myclass->Foo(); // 公有,受保護,私有都可以執行


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // 此方法為公有
    function Foo2()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate(); // 這行會產生一個致命錯誤
    }
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 這行能被正常執行
$myclass2->Foo2(); // 公有的和受保護的都可執行,但私有的不行

class Bar
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }
    
    public function testPublic() {
        echo "Bar::testPublic\n";
    }
    
    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}

class Foo extends Bar
{
    public function testPublic() {
        echo "Foo::testPublic\n";
    }
    
    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>

 

介面:

使用介面(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。

介面是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。

介面中定義的所有方法都必須是公有,這是介面的特性。

要實現一個介面,使用 implements 操作符。類中必須實現介面中定義的所有方法,否則會報一個致命錯誤。類可以實現多個介面,用逗號來分隔多個介面的名稱。

<?php

// 宣告一個'iTemplate'介面
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}


// 實現介面
class Template implements iTemplate
{
    private $vars = array();
  
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
  
    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }
 
        return $template;
    }
}

常量:

可以把在類中始終保持不變的值定義為常量。在定義和使用常量的時候不需要使用 $ 符號。

常量的值必須是一個定值,不能是變數,類屬性,數學運算的結果或函式呼叫。

<?php
class MyClass
{
    const constant = '常量值';

    function showConstant() {
        echo  self::constant . PHP_EOL;
    }
}

echo MyClass::constant . PHP_EOL;

$classname = "MyClass";
echo $classname::constant . PHP_EOL; // 自 5.3.0 起

$class = new MyClass();
$class->showConstant();

echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
?>

抽象類:

任何一個類,如果它裡面至少有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的。

定義為抽象的類不能被例項化。

被定義為抽象的方法只是聲明瞭其呼叫方式(引數),不能定義其具體的功能實現。

繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法;另外,這些方法的訪問控制必須和父類中一樣(或者更為寬鬆)。例如某個抽象方法被宣告為受保護的,那麼子類中實現的方法就應該宣告為受保護的或者公有的,而不能定義為私有的。

<?php
abstract class AbstractClass
{
 // 強制要求子類定義這些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>

static關鍵字:

宣告類屬性或方法為 static(靜態),就可以不例項化類而直接訪問。

靜態屬性不能通過一個類已例項化的物件來訪問(但靜態方法可以)。

由於靜態方法不需要通過物件即可呼叫,所以偽變數 $this 在靜態方法中不可用。

靜態屬性不可以由物件通過 -> 操作符來訪問。

<?php
class Foo {
  public static $my_static = 'foo';
  
  public function staticValue() {
     return self::$my_static;
  }
}

print Foo::$my_static . PHP_EOL;
$foo = new Foo();

print $foo->staticValue() . PHP_EOL;
?>    

final關鍵字:

如果父類中的方法被宣告為 final,則子類無法覆蓋該方法。如果一個類被宣告為 final,則不能被繼承。