预定义类

本节列出了标准预定义类。各种扩展定义了其他类,这些类在其参考中进行了描述。

标准定义类

这些类是在 PHP 构建中包含的标准函数集中定义的。

目录
dir() 创建。
stdClass
一个通用的空类,它是在 类型转换为对象 或者各种标准函数的结果。
__PHP_Incomplete_Class
可能由 unserialize() 创建。
Exception
ErrorException
php_user_filter
Closure
预定义的最终类 Closure 用于表示 匿名函数
Generator
预定义的最终类 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'))
*/
?>

注意:此函数会输出一行代码,这对于保存在缓存文件中以供包含/评估很有用。它没有格式化以供易读性。如果你想为调试目的打印可读版本,我建议使用 print_r() 或 var_dump()。
spark at limao dot com dot br
12 年前
如果你想要一个可以从中扩展的动态类,并动态添加属性和方法,你可以使用以下代码
<?php
class Dynamic extends stdClass{
public function
__call($key,$params){
if(!isset(
$this->{$key})) throw new Exception("Call to undefined method ".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
6 年前
有一个由 (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("Call to undefined method " . __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("Call to undefined method " . __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
class stdObject {
public function
__construct(array $arguments = array()) {
if (!empty(
$arguments)) {
foreach (
$arguments as $property => $argument) {
if (
$argument instanceOf Closure) {
$this->{$property} = $argument;
} else {
$this->{$property} = $argument;
}
}
}
}

public function
__call($method, $arguments) {
if (isset(
$this->{$method}) && is_callable($this->{$method})) {
return
call_user_func_array($this->{$method}, $arguments);
} else {
throw new
Exception("Fatal error: Call to undefined method stdObject::{$method}()");
}
}
}

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

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

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

var_dump($person->name, $person->test(), $person->sayHi2());
?>
xzero at elite7hackers dot net
6 年前
这是由发布的惊人代码片段的改进版本,它允许动态方法生成,并作为 StdClass 的通用扩展工作

此版本更快,针对闭包进行了优化,并且仅适用于闭包。兼容:>= PHP 5.6
<?php

class Dynamic extends \stdClass
{
public function
__call($key, $params)
{
if ( ! isset(
$this->{$key})) {
throw new
Exception("Call to undefined method " . __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("Call to undefined method " . __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