原文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的动态特性, 感谢原作者分享。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver CS6
Visual web development tools

WebStorm Mac version
Useful JavaScript development tools

Zend Studio 13.0.1
Powerful PHP integrated development environment

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.