【php手册】数据类型(array,object,callback/callable,error_reporting),
array对象
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*’ 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:
class A {
private $A; // This will become '\0A\0A'
}
class B extends A {
private $A; // This will become '\0B\0A'
public $AA; // This will become 'AA'
}
var_dump((array) new B());
object对像
除对象外,其他任何类型的值转换为对象,将会创建一个stdClass内置类的实例。如果该值为null,则新的实例为空。
array转换为object将使键名成为属性名,并使其具有相对应的键值。除数字键外,不迭代就无法被访问。对于其他值的转换,会包含进成员变量scalar。
//create new empty object
$obj1 = new \stdClass; // Instantiate stdClass object
$obj2 = new class{}; // Instantiate anonymous class(php7)
$obj3 = (object)[]; // Cast empty array to object
Callback/Callable
PHP是将函数以string形式传递的。 可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
一个已实例化的 object 的方法被作为 array 传递,下标 0 包含该 object,下标 1 包含方法名。 在同一个类里可以访问 protected 和 private 方法。
静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 ‘ClassName::methodName’。
除了普通的用户自定义函数外,也可传递 匿名函数 给回调参数。
//Example #1 回调函数示例
<?php
// An example callback function
function my_callback_function() {
echo 'hello world!';
}
// An example callback method
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Type 1: Simple callback
call_user_func('my_callback_function');
// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');
// Type 5: Relative static class method call (As of PHP 5.3.0)
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
// Type 6: Objects implementing __invoke can be used as callables (since PHP 5.3)
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
//Example #2 使用 Closure 的示例
<?php
// Our closure
$double = function($a) {
return $a * 2;
};
// This is our range of numbers
$numbers = range(1, 5);
// Use the closure as a callback here to
// double the size of each element in our
// range
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
//#example 3
<?php
class Foo {
public static function doAwesomeThings() {
FunctionCaller::callIt('Foo::someAwesomeMethod');
}
public static function someAwesomeMethod() {
echo 'hello world';
}
}
class FunctionCaller {
public static function callIt(callable $func) {
call_user_func($func);
}
}
Foo::doAwesomeThings();
?>
//#example 4
<?php
class MyClass {
public $property = 'Hello World!';
public function MyMethod()
{
call_user_func(array($this, 'myCallbackMethod'));
}
public function MyCallbackMethod()
{
echo $this->property;
}
}
$obj = new MyClass();
echo $obj->MyMethod();
?>
error_reporting
error_reporting — 设置应该报何种错误。
predefined constants
predefined constants(bitmask)description
E_ERROR ( 1 )
致命的运行时错误。一般是不可恢复的情况,例如内存分配导致的问题。
E_WARNING ( 2 )
运行时警告(非致命错误)。仅给提示。
E_PARSE ( 4 ) 编译时语法解析错误。分析器产生。
E_NOTICE ( 8 )
运行时通知。脚本可能表现为错误。
E_CORE_ERROR ( 16 )
php初始化启动过程中发生的致命错误。类似 E_ERROR,但是由php引擎核心产生。(since PHP 4)
E_CORE_WARNING ( 32 )
php初始化启动过程中发生的警告(非致命错误)。类似 E_WARNING,但是由php引擎核心产生。(since PHP 4)
E_COMPILE_WARNING ( 64 )
编译时警告(非致命错误)。类似E_WARNING,但是由Zend脚本引擎产生。(since PHP 4)
E_USER_ERROR ( 256 )
用户产生的错误信息。类似E_ERROR,但是由用户自己在代码中使用 trigger_error() 函数产生。(since PHP 4)
E_USER_WARNING ( 512 )
用户产生的警告信息。(since PHP 4)
E_USER_NOTICE ( 1024 )
用户产生的通知信息。(since PHP 4)
E_STRICT ( 2048 )
启用php对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。(since PHP 5,included in E_ALL until PHP 5.4.0)
E_RECOVERABLE_ERROR ( 4096 )
可被捕捉的致命错误。可能发生了非常危险的错误,可能成为E_ERROR导致脚本终止。(since PHP 5.2.0)
E_DEPRECATED ( 8192 )
运行时警告。启用后将会对在未来版本中可能无法正常工作的代码给出警告。(since PHP 5.3.0)
E_USER_DEPRECATED ( 16384 )
用户产生的警告信息。类似E_DEPRECATED,由用户使用trigger_error()产生。(since PHP 5.3.0)
E_ALL (32767 in PHP 5.4.x, 30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously)支持所有的错误和警告(except of E_STRICT prior to PHP 5.4.0)
上述值(数字或符号)用于构建一个指定要报告哪些错误的位掩码。您可以使用按位运算符来组合这些值或掩盖某些类型的错误。 请注意,只有’|’,’〜’,’!’,’^’和’&’可以在php.ini中理解。
The above values (either numerical or symbolic) are used to build up a bitmask that specifies which errors to report. You can use the bitwise operators to combine these values or mask out certain types of errors. Note that only ‘|’, ‘~’, ‘!’, ‘^’ and ‘&’ will be understood within php.ini.(感觉没翻译好,暂且留下英文)
//获取错误报告常量值(常量名和数值)
<?php
$errLvl = error_reporting();
for ($i = 0; $i < 15; $i++ ) {
print FriendlyErrorType($errLvl & pow(2, $i)) . "<br>\\n";
}
function FriendlyErrorType($type)
{
switch($type)
{
case E_ERROR: // 1 //
return 'E_ERROR';
case E_WARNING: // 2 //
return 'E_WARNING';
case E_PARSE: // 4 //
return 'E_PARSE';
case E_NOTICE: // 8 //
return 'E_NOTICE';
case E_CORE_ERROR: // 16 //
return 'E_CORE_ERROR';
case E_CORE_WARNING: // 32 //
return 'E_CORE_WARNING';
case E_COMPILE_ERROR: // 64 //
return 'E_COMPILE_ERROR';
case E_COMPILE_WARNING: // 128 //
return 'E_COMPILE_WARNING';
case E_USER_ERROR: // 256 //
return 'E_USER_ERROR';
case E_USER_WARNING: // 512 //
return 'E_USER_WARNING';
case E_USER_NOTICE: // 1024 //
return 'E_USER_NOTICE';
case E_STRICT: // 2048 //
return 'E_STRICT';
case E_RECOVERABLE_ERROR: // 4096 //
return 'E_RECOVERABLE_ERROR';
case E_DEPRECATED: // 8192 //
return 'E_DEPRECATED';
case E_USER_DEPRECATED: // 16384 //
return 'E_USER_DEPRECATED';
}
return "";
}
?>
//获取错误报告常量(常量名和数值)
//获取错误报告常量名
<?php
$pot = 0;
foreach (array_reverse(str_split(decbin(error_reporting()))) as $bit) {
if ($bit == 1) {
echo array_search(pow(2, $pot), get_defined_constants(true)['Core']). "<br>\n";
}
$pot++;
}
?>
//输入常量数值,获取常量名
<?php
function readable_error_type($error_code)
{
$constants = array();
foreach(get_defined_constants() as $key => $value)
{
if(strpos($key, 'E_') === 0 && ($value <= $error_code) && ($value & $error_code))
{
$constants[] = $key;
}
}
return implode(' | ', $constants);
}
?>
PHP之友评论