- 論壇徽章:
- 0
|
特性7,動(dòng)態(tài)創(chuàng)建函數(shù)
<?php
// lambda函數(shù)
$newfunc = create_function('$a,$b', 'return "$a + $b = " . $a + $b;'); // 創(chuàng)建了一個(gè)匿名函數(shù)
print "\nNew anonymous function: $newfunc\n";
print $newfunc(2, 4);
print "\n";
// 效果類似于
function test($a,$b){
return "$a + $b = " . $a + $b;
}
print test(2, 4);
?>
特性8、自動(dòng)加載對(duì)象
可以定義一個(gè) __autoload 函數(shù),它會(huì)在試圖使用尚未被定義的類時(shí)自動(dòng)調(diào)用。
<?php
// ClassA.php, 這段代碼寫在ClassA.php
class A {
function __construct() {
print 'yeah!';
}
}
?>
<?php
function __autoload($className) {
require_once $className . '.php';
}
// 這段代碼寫在b.php
new A(); // 程序運(yùn)行到這里的時(shí)候,A類未定義,將自動(dòng)調(diào)用__autoload()函數(shù)
?>
特性9、__get和__set代替所有對(duì)屬性變量數(shù)組的訪問(wèn)
<?php
class Setter{
public $n;
private $x = array("a" => 1, "b" => 2, "c" => 3);
private function __get($nm) {
echo "Getting [$nm]\n";
if (isset($this->x[$nm])) {
$r = $this->x[$nm];
print "Returning: $r\n";
return $r;
} else {
echo "Nothing!\n";
}
}
private function __set($nm, $val) {
echo "Setting [$nm] to $val\n";
if (isset($this->x[$nm])) {
$this->x[$nm] = $val;
echo "OK!\n";
} else {
echo "Not OK!\n";
}
}
private function __isset($nm) {
echo "Checking if $nm is set\n";
return isset($this->x[$nm]);
}
private function __unset($nm) {
echo "Unsetting $nm\n";
unset($this->x[$nm]);
}
}
$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump(isset($foo->a)); //true
unset($foo->a);
var_dump(isset($foo->a)); //false
// this doesn't pass through the __isset() method
// because 'n' is a public property
var_dump(isset($foo->n));
var_dump($foo);
?>
特性10、自定義未定義的方法
你調(diào)用未定義方法時(shí),方法名和方法接收的參數(shù)將會(huì)傳給__call方法
<?php
class Caller {
private $x = array(1, 2, 3);
private function __call($m, $a) {
print "Method $m called:\n";
print_r($a);
return $this->x;
}
}
$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
print_r($a);
?>
特性11、自定義錯(cuò)誤、異常處理
設(shè)置使用自定義錯(cuò)誤或異常處理函數(shù)后,當(dāng)發(fā)生錯(cuò)誤或異常時(shí)將調(diào)用自定義的處理函數(shù)代替系統(tǒng)錯(cuò)誤處理函數(shù)。
<?php
set_error_handler('error_handler'); // 設(shè)置錯(cuò)誤時(shí)調(diào)用的自定義處理錯(cuò)誤函數(shù),設(shè)置自定義異常處理函數(shù)為set_exception_handler()
print $a/0; // 這里邏輯錯(cuò)了,調(diào)用error_handler()報(bào)錯(cuò)
function error_handler($errno, $message, $filename, $line) {
if ($errno & (E_ALL ^ E_NOTICE)) {
$types = array(
1 => 'error',
2 => 'warning',
4 => 'parse error',
8 => 'notice',
16 => 'core error',
32 => 'core warning',
64 => 'compile error',
128 => 'compile warning',
256 => 'user error',
512 => 'user warning',
1024 => 'user notice',
2048 => 'strict warning'
);
print "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
print $types[$errno] .': '. $message .' in '. $filename .' on line '. $line .'.';
print "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
exit;
}
}
?>
特性12、高可配置性
可修改范圍為
PHP_INI_USER 的 配置選項(xiàng)可在用戶的PHP腳本或Windows注冊(cè)表中設(shè)置
PHP_INI_PERDIR 的 配置選項(xiàng)可在 php.ini, .htaccess 或 httpd.conf 中設(shè)置
PHP_INI_SYSTEM 的 配置選項(xiàng)可在 php.ini or httpd.conf 中設(shè)置
PHP_INI_ALL 的 配置選項(xiàng)可在各處設(shè)置
我們要熟悉在php.ini中修改php的配置,還會(huì)經(jīng)常在php腳本中修改腳本中可修改的配置項(xiàng)。
可以使用 ini_set()函數(shù)或?qū)iT修改運(yùn)行時(shí)配置的函數(shù)來(lái)改變可修改范圍為PHP_INI_ALL
<?php
// 修改php的配置參數(shù)
ini_set('session.save_path', 'D:/temp'); // 修改配置讓腳本把session文件保存到D:/temp目錄
?>
特性13、代碼中執(zhí)行php腳本
<?php
$s = '$a = "xxxxxxxxxx"; if($a) { print $a;}';
eval($s);
[ 本帖最后由 lib 于 2008-10-18 23:36 編輯 ] |
|