热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP中动态特性学习笔记

一篇PHP中动态特性学习笔记,如果你对于PHP特性不了解的我们可以进入参考本文章,本文章对于PHP动态特性详细的作了介绍了,好了费话不说了我们来看例子吧,有需要的朋友可参考一下.本文主要总结给...
一篇PHP中动态特性学习笔记,如果你对于PHP 特性不了解的我们可以进入参考本文章,本文章对于PHP动态特性详细的作了介绍了,好了费话不说了我们来看例子吧,有需要的朋友可参考一下.

本文主要总结给对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) . ": $testn"; 
$test = 1.23456789; 
print gettype($test) . ": $testn"; 
$test = 'test';  // 变量自动改变类型 
print gettype($test) . ": $testn"; 
$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); 
}

弱类型并不意味着代码不安全,或者不健壮,极限编程已经给成为一种软件开发方法,这个方法侧重测试,使用全面的单元测试方案来驱动开发过程,通过不同环境下执行所编写的代码,就可以保证代码的安全性和健壮性,经验证明,在弱类型语言中,综合运用弱类型和单元测试通常比传统系统编程语言的类型检查更好.

特性2、可变变量

一个变量的变量名可以动态的设置和使用代码如下:

// 可变变量例子 
$var = 'hi'; 
$$var = 'hello'; 
print $var; 
print $$var; 
print $hi;  // 等价于上一行

特性3、变量函数

这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且将尝试执行它,除了别的事情以外,这个可以被用于实现回调函数,函数表等等,代码如下:

// 变量函数例子 
// 无参数函数 
function a(){ 
	print "i'm an"; 
} 
// 有参数函数 
function b($param) { 
	print "i'm b, param: $paramn"; 
} 
$x = 'a'; 
$x(); 
$x = 'b'; 
$x('xxxxxxxxxxx');

特性4、可变长度参数列表

调用函数的时候,函数的参数个数可以不一样,代码如下:

function foo() { 
   $numargs = func_num_args(); 
   print "Number of arguments: $numargsn"; 
   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: $newfuncn"; 
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!'; 
	} 
} 
 
5 
function __autoload($className) { 
   require_once $className . '.php'; 
}

特性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: $rn"; 
		   return $r; 
	   } else { 
		   echo "Nothing!n"; 
	   } 
   } 
   private function __set($nm, $val) { 
	   echo "Setting [$nm] to $valn"; 
	   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 setn"; 
	   return isset($this->x[$nm]); 
   } 
   private function __unset($nm) { 
	   echo "Unsetting $nmn"; 
	   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的工作模型(这个特性详细的在).

作为一种纯解释型语言,PHP脚本在每次被解释时进行初始化,在解释完毕后终止运行。这种运行是互相独立的,每一次请求都会创建一个单独的进程或线程,来解释相应的页面文件,页面创建的变量和其他对象,都只在当前的页面内部可见,无法跨越页面访问旧电脑回收.

在终止运行后,页面中申请的、没有被代码显式释放的外部资源,包括内存、数据库连接、文件句柄、Socket连接等,都会被强行释放.

也就是说,PHP无法在语言级别直接访问跨越页面的变量,也无法创建驻留内存的对象。

PHP这种独特的工作模型的优势在于,基本上解决了令人头疼的资源泄漏问题,Web应用的特点是大量的、短时间的并发处理,对各种资源的申请和释放工作非常频繁,很容易导致泄漏.

但是,这种机制的缺点也非常明显,最直接的后果是,PHP在语言级别无法实现跨页面的缓冲机制.

补充一点,对象克隆

PHP对象赋值到变量是传引用的,需要复制对象需要用clone.

推荐阅读
  • php课程Json格式规范需要注意的小细节
    JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgramming ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • PHP编程能开发哪些应用?
    导读:很多朋友问到关于PHP编程能开发哪些应用的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • 让你明白kvm是什么
    参考:https:blog.csdn.netbbwangjarticledetails80465320KVM工具集合:libvirt:操作和管理KVM虚机的虚拟化API ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文是关于C#类型系统、值类型和引用类型的概念性笔记。介绍了C#1系统类型的三个特性,静态类型的含义,显式类型和隐式类型的区别。还讨论了类、结构、数组类型、枚举、委托类型和接口类型属于哪一种类型。同时纠正了关于结构、引用类型和对象传递的错误表述。最后提到了C#4中使用动态类型的关键字。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 导读:在编程的世界里,语言纷繁多样,而大部分真正广泛流行的语言并不是那些学术界的产物,而是在通过自由发挥设计出来的。和那些 ... [详细]
  • 与.Net大师Jeffrey Richter面对面交流——TUP对话大师系列活动回顾(多图配详细文字)...
    与.Net大师JeffreyRichter面对面交流——TUP对话大师系列活动回顾(多图配文字)上周末很有幸参加了CSDN举行的TUP活动, ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • gitlab重置password
    ruby没怎么学,自己搭建的gitlab的rootpassword又忘了。幸好看见此帖子,试验okhttp:roland.kierkels.netgitreset-your-git ... [详细]
author-avatar
ccsv0601604
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有