以下示例使用php中的正则表达式,进行xml文件的读取。
1、xml文件内容,person.xml
<humans>
<zhangying>
<name>张映</name>
<sex>男</sex>
<old>28</old>
</zhangying>
<tank>
<name>tank</name>
<sex>男</sex>
<old>28</old>
</tank>
</humans>
2、php处理文件,rexml.php
/***
@ 使用正则表达式读取xml文件
@ Recoded By Androidyue
@ site www.
***/
$xml = "";
//只读模式打开所读取的文件
$f = fopen('person.xml', 'r');
//格式化获取读取的数据
while( $data = fread( $f, 4096 ) ) {
$xml .= $data;
}
//关闭一个已打开的文件指针
fclose( $f );
// 上面读取数据
preg_match_all( "//<humans/>(.*?)/<//humans/>/s", $xml, $humans ); //匹配最外层标签里面的内容
//格式化数据
foreach( $humans[1] as $k=>$human ){
preg_match_all( "//<name/>(.*?)/<//name/>/", $human, $name ); //匹配出名字
preg_match_all( "//<sex/>(.*?)/<//sex/>/", $human, $sex ); //匹配出性别
preg_match_all( "//<old/>(.*?)/<//old/>/", $human, $old ); //匹配出年龄
}
//处理结果数据
foreach($name[1] as $key=>$val){
echo $val." - ".$sex[$key][1]." - ".$old[$key][1]."<br>" ;
}
?>
注意:
两个文件的编码格式,请保持一致,最好都设成UTF8的字符集,以免出现莫名的错误。
问题:PHP5中魔术方法函数有哪几个,请举例说明各自的用法?
__wakeup __construct, __destruct __call, __get, __set, __isset(), __unset __sleep,
__toString, __set_state, __clone __autoload
1.__autoload() 类文件自动加载函数
这个魔术方法是用来自动加载程序所用到类文件的PHP源文件,这样就避免了我们一个一个自动去require或者include了,这个函数会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类,但是我最近看过一篇文章,上面说__autoload()的效率不是很高。以下是示例代码:
<?php
功能:在当前页使用类时自动加载该类的文件
参数$className 为类的名称 可自定义
*/
function __autoload($className){
$className=strtolower()($className);//最好加上这一步,因为类首字母大写,某些系统区分文件名的大小写
require("$className.class.php");//加载类文件 One.class.php Two.class.php与本文件在同一目录下
echo '------------------------------<br>';//作为调用时的标记来测试
}
//以下两个类均未在本文件中定义
$o=new One();//使用One类,对其初始化
$t=new Two();//使用Two类,对其初始化
?>
注意这个函数如果需要正常加载,需要将文件名设置成类名(推荐小写).class.php等类名和文件名有某种关联才可以,另外如果这个函数出现异常不能被Catch捕获,将会显示Fatal Error
2.__construct() 构造函数
在C#和PHP4中构造函数的函数名都是与类名相同,当然PHP5也支持这样(如果找不到__construct方法后会找函数名与类名相同的作为构造函数),之所以这样写的好处是如果我们想更改类的名字,我们就只改类名就可以,不用在更改构造函数的函数名,同时从某种程度上减少了我们出错的概率,示例代码还是简单写一下吧!
<?php
class PcYoYo{
private $url;
function __construct($url){
$this->url=$url;
}
}
?>
3.__destruct() 析构函数
__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.
析构函数允许你在使用一个对象之后执行任意代码来清除内存.
当PHP决定你的脚本不再与对象相关时,析构函数将被调用.
在一个函数的命名空间内,这会发生在函数return的时候.
对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.
4.__call() 当所调用的成员方法不存在(或者没有权限)该类时调用,用于对错误后做一些操作或者提示信息
<?php
//初始化一个类
class Person{
private $name;
private $age;
private $sex;
function walk($hour,$minute){
echo "$hour :$minute We will walk<br>";
}
function run(){
}
//使用魔术方法__call
/*****
功能:在对象调用类中不存在的函数时自动调用,进行一些操作
参数:$proName 所调用函数名称 $args 参数数组 $proName ,$args 为自定义的形参可符合自己风格变动,但是这两个参数的意义是固定的
*****/
function __call($proName,$args){
echo "The $proName doesn't exist! the parameters are";
print_r($args);
echo '<br>';
}
}// the end of class
//实例化一个对象
$p=new Person();
//调用Person类中存在的方法
$p->walk(5,39);
//调用Person类中不存在的方法
$p->work();//如果没有使用魔术方法__call,则程序发生错误,错误信息Fatal error: Call to undefined method Person::work() in D:/phpnow/htdocs/holiday/magic__call.php on line 29
//如果使用了魔术方法__call,则在对象调用类中不存在的函数时,__call被自动调用,用来执行某些操作。
?>
5.__clone()
该函数在对象克隆时自动调用,其作用是对克隆的副本做一些初始化操作
<?php
//初始化一个类
class Computer{
//
public $cpu='intel';
private $monitor;
private $keyboard;
//设置魔术方法__clone()函数
function __clone(){//如果不设置这个魔术方法那么克隆出来的就是一模一样的,__clone函数和类的构造函数类似都是做一些初始化操作
$this->cpu='AMD';//$this指的是新创建的克隆对象
}
//设置析构函数,用来比较=和clone的区别
function __destruct(){
echo '*************************************<br>';
}
}// the end of the class
//实例化一个对象
$c1=new Computer();
//使用引用的方法在添加一个引用,因为对象的引用是存放在内存中的栈内存中,如果按指针的说法,那么这样做就是在内存中有创建了一个指针指向$c1指向的对象
//我们可以通过条用析构函数判断出来这样不是复制了对象
$c2=$c1;
//使用clone方法克隆一个对象
$c3=clone $c1;
//输出两者的信息比较
echo $c1->cpu,'<br>';
echo $c3->cpu,'<br>';
?>
6.__get() 当所对象所调用的成员属性未声明或者级别为private或者protected等时,我们可以在这个函数里进行自己的一些操作
<?php
class Person{
private $name;
public $nation;
function __get($para){//必须有一个参数
echo $para.'不存在';
}
}
$p=new Person();
$name=$p->name;//call the __get function
$nation=$p->nation;//never call the __get function
?>
7.__set() 当所对未声明或者级别为private或者protected等进行赋值时调用此函数,我们可以在这个函数里进行自己的一些操作
<?php
class Pc{
private $key;
function __set($key,$value){//必须有两个参数一个是成员属性,另一个是值
echo '对'.$key.'赋值为'.$value.'失败';
}
}
$p=new Pc();
$p->key=123;
?>
1、fopen(创建文件和打开文件)
语法:
fopen(filename,mode)
filename,规定要打开的文件。mode,打开文件的模式,可能的值见下表。
mode 说明
"r" 只读方式打开,将文件指针指向文件开头。
"r+" 读写方式打开,将文件指针指向文件开头。
"w" 写入方式打开,将文件指针指向文件开头并将文件大小截为零。如果文件不存在则尝试创建。
"w+" 读写方式打开,将文件指针指向文件开头并将文件大小截为零。如果文件不存在则尝试创建。
"a" 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建。
"a+" 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建。
如果成功打开文件,fopen函数的返回值是一个文件指针,如果出错,返回 FALSE。
示例:
$fp
= fopen("test.txt", "r");
?>
2.fclose(关闭文件)
语法:
fclose(filepointer)
filepointer,要关闭的文件指针。如果成功,fclose 函数返回 TRUE,如果失败,fclose 函数返回 FALSE。
示例:
$fp = fopen("test.txt", "r");
fclose($fp);
?>
3.feof(检测是否已到达文件末尾)
语法:
feof(filepointer)
filepointer,要检测的文件指针,该指针必须指向成功打开没有关闭的文件。如果文件指针到了文件末尾或者出错时,feof函数返回 TRUE。
示例:
$fp = fopen("test.txt", "r");
while(! feof($fp))
{
echo fgets($fp). "<br />";
}
fclose($fp);
?>
4.fgets(从文件指针中读取一行)
语法:
fgets(filepointer)
filepointer,要读取的文件指针。如果成功,从文件中读取一行并返回字符串,如果失败,返回 FALSE。
示例:
$fp = fopen("test.txt", "r");
if($fp)
{
for($i=1;! feof($fp);$i++)
{
echo "行".$i." : ".fgets($fp). "<br />";
}
}
else
{
echo "打开文件失败";
}
fclose($fp);
?>
假设test.txt的内容为:
hello world
hello cnblogs
hello heihaozi
hello everyone
输出结果为:
行1 : hello world
行2 : hello cnblogs
行3 : hello heihaozi
行4 : hello everyone
5.fwrite(写入文件)
语法:
fwrite(filepointer,string)
filepointer,要写入的文件指针。string,要写入的字符串。如果成功,返回写入的字符数,如果失败,返回 FALSE。
示例:
$fp = fopen("test.txt", "w");//文件被清空后再写入
if($fp)
{
$count=0;
for($i=1;$i<=5;$i++)
{
$flag=fwrite($fp,"行".$i." : "."Hello World!\r\n");
if(!$flag)
{
echo "写入文件失败<br>";
break;
}
$count+=$flag;
}
echo "共写入".$count."个字符";
}
else
{
echo "打开文件失败";
}
fclose($fp);
?>
输出结果为:
共写入100个字符
test.txt文件中被写入如下的内容:
行2 : Hello World!
行3 : Hello World!
行4 : Hello World!
行5 : Hello World!
说明:在以上的介绍中,为了简化操作,部分函数的可选参数没有列出。