PHP Conference Japan 2024

預定義類別

此區段列出了標準的預定義類別。其他擴充功能定義了其他類別,這些類別在其參考文件中有所描述。

標準定義類別

這些類別定義在 PHP 內建的標準函式集中。

Directory
dir() 建立。
stdClass
一個通用的空類別,由類型轉換為物件或各種標準函式所建立。
__PHP_Incomplete_Class
可能由 unserialize() 建立。
Exception
ErrorException
php_user_filter
Closure
預定義的 final 類別 Closure 用於表示匿名函式
Generator
預定義的 final 類別 Generator 用於表示產生器
ArithmeticError
AssertionError(斷言錯誤)
DivisionByZeroError(除以零錯誤)
Error(錯誤)
Throwable(可拋出異常)
ParseError(解析錯誤)
TypeError(類型錯誤)

特殊類別

以下識別字由於具有特殊用途,不得用作類別名稱。

self
目前類別.
static
執行時期的目前類別.
parent
父類別.
新增註記

使用者貢獻的註記 7 則註記

wyattstorch42 at outlook dot com
10 年前
如果您對 stdClass 的實例呼叫 var_export(),它會嘗試使用 ::__set_state() 匯出它,但由於某些原因,stdClass 並未實作此方法。

然而,將關聯式陣列轉換為物件通常會產生相同的效果(至少在我的情況下是如此)。因此,我編寫了一個 improved_var_export() 函式,將 stdClass 的實例轉換為 (object) array () 呼叫。如果您選擇匯出任何其他類別的物件,我建議您實作 ::__set_state()。

<?php
/**
* 一個與 stdClass 實例相容的 var_export() 實作。
* @param mixed $variable 您想要輸出的變數
* @param bool $return 如果使用並設定為 true,improved_var_export()
* 將會返回變數表示法,而不是輸出它。
* @return mixed|null 當 return 參數被使用且評估為 TRUE 時,返回變數表示法。否則,此
* 函式將返回 NULL。
*/
function improved_var_export ($variable, $return = false) {
if (
$variable instanceof stdClass) {
$result = '(object) '.improved_var_export(get_object_vars($variable), true);
} else if (
is_array($variable)) {
$array = array ();
foreach (
$variable as $key => $value) {
$array[] = var_export($key, true).' => '.improved_var_export($value, true);
}
$result = 'array ('.implode(', ', $array).')';
} else {
$result = var_export($variable, true);
}

if (!
$return) {
print
$result;
return
null;
} else {
return
$result;
}
}

// 使用範例:
$obj = new stdClass;
$obj->test = 'abc';
$obj->other = 6.2;
$obj->arr = array (1, 2, 3);

improved_var_export((object) array (
'prop1' => true,
'prop2' => $obj,
'assocArray' => array (
'apple' => 'good',
'orange' => 'great'
)
));

/* 輸出:
(object) array ('prop1' => true, 'prop2' => (object) array ('test' => 'abc', 'other' => 6.2, 'arr' => array (0 => 1, 1 => 2, 2 => 3)), 'assocArray' => array ('apple' => 'good', 'orange' => 'great'))
*/
?>

注意:這個函式會輸出單行程式碼,這對於儲存到快取檔案中以供 include/eval 很有用。它的格式並非為了易讀性而設計。如果您想要印出易讀版本以進行除錯,建議您使用 print_r() 或 var_dump()。
spark at limao dot com dot br
13 年前
如果您需要一個可以動態新增屬性和方法的類別,您可以使用以下方法:
<?php
class Dynamic extends stdClass{
public function
__call($key,$params){
if(!isset(
$this->{$key})) throw new Exception("呼叫未定義的方法 ".get_class($this)."::".$key."()");
$subject = $this->{$key};
call_user_func_array($subject,$params);
}
}
?>

這個方法可以接受陣列、字串和閉包。
<?php
$dynamic
->myMethod = "thatFunction";
$dynamic->hisMethod = array($instance,"aMethod");
$dynamic->newMethod = array(SomeClass,"staticMethod");
$dynamic->anotherMethod = function(){
echo
"Hey there";
};
?>

然後就可以呼叫它們了 =D
xzero at elite7hackers dot net
7 年前
(spark at limao dot com dot br) 發佈了一個很棒的程式碼片段,可以動態產生方法,作為 StdClass 的多功能擴展,這裡有一個改進版本。

這個版本更快,針對閉包進行了優化,並且只適用於閉包。相容版本:>= PHP 5.6
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("呼叫未定義的方法 " . __CLASS__ . "::" . $key . "()");
}

return
$this->{$key}->__invoke(... $params);
}
}

?>

使用方法範例

<?php
$dynamic
= new Dynamic();
$dynamic->anotherMethod = function () {
echo
"Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return
mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod()
);
?>

這個方法可以接受陣列、字串和閉包,但由於使用 call_user_func_array,速度會稍慢。
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("呼叫未定義的方法 " . __CLASS__ . "::" . $key . "()");
}

return
call_user_func_array($this->{$key}, $params);
}
}

?>

使用方法範例
<?php
$dynamic
= new Dynamic();
$dynamic->myMethod = "thatFunction";
$dynamic->hisMethod = array($dynamic, "randomInt");
$dynamic->newMethod = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
echo
"Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return
mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod(),
$dynamic->hisMethod()
);

?>
unknown
22 年前
擁有一個保留類別的陣列會很方便.....
var_dump (get_declared_classes ());
Ashley Dambra
10 年前
這裡有一個允許設定匿名函式的簡單類別。它是 stdClass 的一個優化版本。

<?php
類別 stdObject {
公開函數
__construct(陣列 $arguments = array()) {
如果 (!empty(
$arguments)) {
foreach (
$arguments 作為 $property => $argument) {
如果 (
$argument instanceof Closure) {
$this->{$property} = $argument;
} else {
$this->{$property} = $argument;
}
}
}
}

公開函數
__call($method, $arguments) {
如果 (isset(
$this->{$method}) && is_callable($this->{$method})) {
返回
call_user_func_array($this->{$method}, $arguments);
} else {
拋出 new
Exception("嚴重錯誤:呼叫未定義的方法 stdObject::{$method}()");
}
}
}

$person = new stdObject(array(
"name" => "nick",
"age" => 23,
"friends" => array("frank", "sally", "aaron"),
"sayHi" => function() {
返回
"Hello there";
}
));

$person->sayHi2 = function() {
返回
"Hello there 2";
};

$person->test = function() {
返回
"test";
};

var_dump($person->name, $person->test(), $person->sayHi2());
?>
xzero at elite7hackers dot net
7 年前
這是一個由 Typer85 at gmail dot com 發表的絕妙程式碼片段的改良版本,它允許動態產生方法,並且可以作為 StdClass 的多功能擴充。

這個版本更快,針對閉包進行了優化,並且只適用於閉包。相容版本:>= PHP 5.6
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("呼叫未定義的方法 " . __CLASS__ . "::" . $key . "()");
}

return
$this->{$key}->__invoke(... $params);
}
}

?>

使用方法範例

<?php
$dynamic
= new Dynamic();
$dynamic->anotherMethod = function () {
echo
"Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return
mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod()
);
?>

這個方法可以接受陣列、字串和閉包,但由於使用 call_user_func_array,速度會稍慢。
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("呼叫未定義的方法 " . __CLASS__ . "::" . $key . "()");
}

return
call_user_func_array($this->{$key}, $params);
}
}

?>

使用方法範例
<?php
$dynamic
= new Dynamic();
$dynamic->myMethod = "thatFunction";
$dynamic->hisMethod = array($dynamic, "randomInt");
$dynamic->newMethod = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
echo
"Hey there";
};
$dynamic->randomInt = function ($min, $max) {
return
mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
$dynamic->randomInt(1, 11),
$dynamic->anotherMethod(),
$dynamic->hisMethod()
);

?>
Typer85 at gmail dot com
17 年前
回覆我下方留言:

這份清單並非不完整。請閱讀手冊,它清楚地列在上面。

「本節列出了標準預定義類別。其他擴充功能定義了其他類別,這些類別在其參考文件中有所描述。」

根據您擁有的擴充功能,它們可能會定義自己的類別。此清單只是 PHP 定義的標準類別,不考慮擴充功能。
To Top