【原创】PHP的动态特性
原文2008年写,发布在PHP杂志2009.1第十五期,看PDF文档效果会更好点。 PHPer15.pdf 下载 作者:流水孟春 121169238(at)qq.com 本文主要总结给对PHP 特性不了解的新手看的,因此演示代码占比较多的篇幅。 大家看还缺哪些给补充吧。欢迎来邮件或在PHPChina 的
原文2008年写,发布在PHP杂志2009.1第十五期,看PDF文档效果会更好点。
PHPer15.pdf 下载
作者:流水孟春 121169238(at)qq.com
本文主要总结给对PHP 特性不了解的新手看的,因此演示代码占比较多的篇幅。
大家看还缺哪些给补充吧。欢迎来邮件或在PHPChina 的《PHPer》杂志版块纠正错误。
动态语言就是能够在运行时改变程序结构和变量类型的语言。例如:新的类和对
象可以被加载和创建,新的函数或方法可以加入和去除等等,比如Smalltalk、Ruby、
Python、PHP、Lua、Perl、Groovy 等。反之则是静态语言,比如C/C++、Java、C#等。
动态语言的动态特性决定它开发的时候需要更少的代码,有更高的灵活性。PHP
的动态特性奠定了它存在的价值,熟悉PHP 的动态特性让我们更能活用PHP。
1 弱类型变量
动态语言都被设计成弱类型,也就是说变量被赋值以后才能确定它的数据类型,
当代码在实际执行时,才会检测变量是否被非法使用。
PHP 变量是弱类型变量就意味着,我们不需要声明变量的类型,在运行时自动检
测变量的类型,并且可以认为改动变量的类型。
2、PHP动态特性:
特性1、弱类型变量
PHP变量是弱类型变量就意味着,我们不需要声明变量的类型,在运行时自动检测变量的类型,并且可以认为改动变量的类型。
// PHP弱类型变量例子 $test = 1; print gettype($test) . ": $test\n"; $test = 1.23456789; print gettype($test) . ": $test\n"; $test = 'test'; // 变量自动改变类型 print gettype($test) . ": $test\n"; $test = array('t'=>'HI,I m from an array!'); settype($test, 'object'); // 改变变量的类型 print gettype($test) . ": {$test->t}\n"; // 测试变量类型 if(is_object($test)) { print "Test Type: My Type Is object.\n"; } else { print gettype($test); }
弱类型并不意味着代码不安全,或者不健壮。极限编程已经给成为一种软件开发方法。这个方法侧重测试,使用全面的单元测试方案来驱动开发过程。通过不同环境
下执行所编写的代码,就可以保证代码的安全性和健壮性。经验证明,在弱类型语言中,综合运用弱类型和单元测试通常比传统系统编程语言的类型检查更好(请参
考《Thinking in Java》作者Bruce Eckel的博客http://mindview.net/WebLog/log-0025)。
特性2、可变变量
一个变量的变量名可以动态的设置和使用
// 可变变量例子 $var = 'hi'; $$var = 'hello'; print $var; print $$var; print $hi; // 等价于上一行
特性3、变量函数
这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且将尝试执行它。除了别的事情以外,这个可以被用于实现回调函数,函数表等等。
// 变量函数例子 // 无参数函数 function a(){ print "i'm a\n"; } // 有参数函数 function b($param) { print "i'm b, param: $param\n"; } $x = 'a'; $x(); $x = 'b'; $x('xxxxxxxxxxx');
特性4、可变长度参数列表
调用函数的时候,函数的参数个数可以不一样
function foo() { $numargs = func_num_args(); print "Number of arguments: $numargs\n"; print "the third argument: " . func_get_arg(2) . "\n"; } foo(1, 2, '...@...'); foo(1, 2, '############', 4);
特性5,从数组中导出变量
把数组中的数据复制出变量,将键名当作变量名,值作为变量的值。
// 例1 $a = array('x' => 100, 'y'=> 200, 'z' => 300); // 从数组中将变量导入到当前的符号表 extract($a); // 和extract相反的函数是compact() print "$x $y $z";
// 例2 $a = array(100, 200, 300); list($x, , $z) = $a; print "$x $z";
特性6,用一个数组的值作为其键名,另一个数组的值作为其值,创建一个数组
$a = array('green', 'red', 'yellow'); $b = array('avocado', 'apple', 'banana'); $c = array_combine($a, $b); print_r($c);
特性7,动态创建函数
// lambda函数 $newfunc = create_function('$a,$b', 'return "$a + $b = " . $a + $b;'); // 创建了一个匿名函数 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、自动加载对象
可以定义一个 __autoload 函数,它会在试图使用尚未被定义的类时自动调用。
// ClassA.php, 这段代码写在ClassA.php class A { function __construct() { print 'yeah!'; } }
function __autoload($className) { require_once $className . '.php'; } // 这段代码写在b.php new A(); // 程序运行到这里的时候,A类未定义,将自动调用__autoload()函数
特性9、__get和__set代替所有对属性变量数组的访问
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、自定义未定义的方法
你调用未定义方法时,方法名和方法接收的参数将会传给__call方法
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、自定义错误、异常处理
设置使用自定义错误或异常处理函数后,当发生错误或异常时将调用自定义的处理函数代替系统错误处理函数。
set_error_handler('error_handler'); // 设置错误时调用的自定义处理错误函数,设置自定义异常处理函数为set_exception_handler() print $a/0; // 这里逻辑错了,调用error_handler()报错 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 的 配置选项可在用户的PHP脚本或Windows注册表中设置
PHP_INI_PERDIR 的 配置选项可在 php.ini, .htaccess 或 httpd.conf 中设置
PHP_INI_SYSTEM 的 配置选项可在 php.ini or httpd.conf 中设置
PHP_INI_ALL 的 配置选项可在各处设置
我们要熟悉在php.ini中修改php的配置,还会经常在php脚本中修改脚本中可修改的配置项。
可以使用 ini_set()函数或专门修改运行时配置的函数来改变可修改范围为PHP_INI_ALL
// 修改php的配置参数 ini_set('session.save_path', 'D:/temp'); // 修改配置让脚本把session文件保存到D:/temp目录
特性13、代码中执行php脚本
特性14、php的工作模型
(这个特性详细的在http://blog.csdn.net/phphot/archive/2008/02/19/2105600.aspx)
作为一种纯解释型语言,PHP脚本在每次被解释时进行初始化,在解释完毕后终止运行。这种运行是互相独立的,每一次请求都会创建一个单独的进程或线程,来解释相应的页面文件。页面创建的变量和其他对象,都只在当前的页面内部可见,无法跨越页面访问旧电脑回收。
在终止运行后,页面中申请的、没有被代码显式释放的外部资源,包括内存、数据库连接、文件句柄、Socket连接等,都会被强行释放。
也就是说,PHP无法在语言级别直接访问跨越页面的变量,也无法创建驻留内存的对象。
PHP这种独特的工作模型的优势在于,基本上解决了令人头疼的资源泄漏问题。Web应用的特点是大量的、短时间的并发处理,对各种资源的申请和释放工作非常频繁,很容易导致泄漏。
但是,这种机制的缺点也非常明显。最直接的后果是,PHP在语言级别无法实现跨页面的缓冲机制。
补充一点,对象克隆
PHP对象赋值到变量是传引用的,需要复制对象需要用clone。
Views – 840
原文地址:【原创】PHP的动态特性, 感谢原作者分享。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
