① 什么时候对象的所有引用都被删除 - 技术问答
对象不需要的时候调用unset()注销对余昌悉告象引用,所有的对象引用被销毁对象就被销毁了,所谓引用就是竖陆扒赋值给了谁
$a= new moqi();
$b=$a;
$c=$b;
那么$b和$c都是对象$a的引用
② php构造函数的PHP 5 构造函数和析构函数
void __construct ([mixed $args [, $... ]])
PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
注意: 如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。 使用新标准的构造函数: <?phpclassBaseClass{function__construct(){printInBaseClassconstructor
;}}classSubClassextendsBaseClass{function__construct(){parent::__construct();printInSubClassconstructor
;}}$obj=newBaseClass();$obj=newSubClass();?>为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct() 函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法,但它却又不是构造函数。 void __destruct (void)
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
析构函数例子: <?phpclassMyDestructableClass{function__construct(){printInconstructor
;$this->name=MyDestructableClass;}function__destruct(){printDestroying.$this->name.
;}}$obj=newMyDestructableClass();?>注意: 和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。 析构函数在脚本关闭时调用,此时所有的头信息已经发出。 试图在析构函数中抛出一个异常会导致致命错误。
③ 请问PHP构造函数的含义
php的两大oop使用型函数:构造函数(__construct)和析构函数(__destruct );
构造函数:当在某一页面写了众多函数,其中就包括构造函数,当你调用其中任一函数时,都将在调用此函数前先调用构造函数,如:你把链接数据库代码写到构造函数里面,然后在使用增删改查时,就不用再写连接s数据库语句了,因为有构造函数在,你就只用写增删改查类sql语句就可以了。
析构函数:和构造函数相反,在同一页面内,有众多函数,其中有析构函数,当你调用了某一函数之后,会自动执行析构函数,比如说你的增删改查用完了,是不是要关闭数据库连接来释放内存?析构函数就是这样用的。
④ PHP里$_SERVER['HTTP_HOST']和$_SERVER['PHP_SELF']区别
两者的区别在于含义不同:
假如命令行的地址是:xxx
那么:$_SERVER['HTTP_HOST']=='www..com'$_SERVER['PHP_SELF']=='/index.php'所以前者是主机地址,后者是脚本文件的绝对路径。
(4)php析构函数作用扩展阅读:
1、新对象模式
*构造函数和析构函数* 对象的引用 * 对象的克隆 * 对象中的私有、公共及受保护模式 * 接口 (Interfaces)
* 抽象类 * __call * __set 和 __get * 静态成员
2、构造函数和析构函数
在 PHP4 中,当函数与对象同名时,这个函数将成为该对象的构造函数,并且在 PHP4 中没有析构函数的概念。
在 PHP5 中,构造函数被统一命名为 __construct,并且引入了析构函数的概念,被统一命名为 __destruct。
3、对象的引用
在PHP4中,传递变量给一个函数或方法,实际是把这个变量做了一次复制,也就意味着你传给函数或方法的是这个变量的一个副本,除非你使用了引用符号“&;” 来声明是要做一个引用,而不是一个 Copy。在 PHP5中,对象总是以引用的形式存在的,对象中的赋值操作同样也都是一个引用操作。
4、对象的克隆
当一个对象始终以引用的形式来被调用时,如果我想得到该对象的一个副本,该怎么办呢?PHP5 提供了一个新的功能,就是对象的克隆,语法为 __clone。
5、抽象类
抽象类不能被实例化。
抽象类与其它类一样,允许定义变量及方法。
抽象类同样可以定义一个抽象的方法,抽象类的方法不会被执行,不过将有可能会在其派生类中执行。
6、__call
PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。
参考资料:网络——PHP
⑤ PHP的其他方面
PHP 在数据库方面的丰富支持,也是它迅速走红的原因之一,它支持下列的数据库或是数据文件:
Adabas 、D、 DBA、dBase 、dbm 、filePro 、Informix 、InterBase、mSQL 、Microsoft SQL Server、·MySQL、Solid、Sybase、 Oracle 、PostgreSQL
而在 Internet 上它也支持了相当多的通讯协议 (protocol),包括了与电子邮件相关的 IMAP,POP3;网管系统 SNMP;网络新闻NNTP;帐号共用 NIS;全球信息网 HTTP 及 Apache 服务器;目录协议 LDAP 以及其它网络的相关函数。
除此之外,用 PHP 写出来的 Web 后端 CGI 程序,可以很轻易的移植到不同的操作系统上。例如,先以 linux 架的网站,在系统负荷过高时,可以快速地将整个系统移到 SUN 工作站上,不用重新编译 CGI 程序。面对快速发展的 Internet,这是长期规划的最好选择。
相关语法及概念
php 支持八种原始类型。
四种标量类型:boolean(布尔型) integer(整型) float(浮点型,也作“double”) string(字符串)
两种复合类型:array(数组)object(对象)
最后是两种特殊类型:resource(资源)NULL
为了确保代码的易读性,本手册还介绍了一些伪类型:mixed、number、callback
语法(例子中均忽略了PHP代码边界符 <?php ?>):
注释的语法有三种: //comment这个是单行注释/*comment*/这个是多行注释#comment这个是脚本类型注释,很少用基本的结构控制语句: //分支结构(选择结构)if(condition){//Statement}if(condition){//Statement}else{//Statement}if(condition){//Statement}elseif(condition){//Statement}//多分支结构switch($变量){case'值'://Statementbreak;case'值2'://Statementbreak;default://Statement}//循环结构while(condition){//Statement}do{//Statement}while(condition);for(初始化;判断;变化){//Statement}//数组遍历专用循环语句foreach($Arrayas$value){echo$value;}foreach($Arrayas$key=>$value){echo$key;echo$value;}一个PHP实例: <html><head><title>Firstprogram</title></head><body>//php中string类型的拼接符和其它大多数采用+号运算符不一样,而是采用.号运算//在一般语言中用于对象属性和方法调用的.运算符,则和C语言的结构体一样用=><?phpechohelloworld.!;?></body></html>php对面向对象的支持
面向对象编程的概念:
不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面:
1.抽象数据类型和信息封装
2.继承
3.多态
在PHP中是通过类来完成封装的: //在OOP类中,通常采用大双驼峰命名法,每个单词的首字母都大写classSomething{//作用域修饰符:public公共的;private私有的;protected受保护的;//属性的名称一般用全小写private$x=null;//在编程建议中,内部使用的属性应该给私有修饰符,然后通过方法取值赋值//方法的名称一般用小驼峰命名法,第一个单词全小写,剩下的单词首字母大写//因为PHP不会自动为变量使用$this所以必须主动加上$this伪变量来指向操作的对象publicfunctionsetX($v){$this->x=$v;}publicfunctiongetX(){return$this->x;}}当然你可以按自己的喜好进行定义,但最好保持一种标准,这样会更有效。数据成员在类中使用var声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方法来说,它只能是局部变量。
使用new操作符来创建一个对象: $obj=newSomething;然后你可以使用成员函数通过: $obj->setX(5);$see=$obj->getX();echo$see;在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。继承在PHP中很容易实现,只要使用extends关键字。 classAnotherextendsSomething{private$y;publicfunctionsetY($v){$this->y=$v;}functiongetY(){return$this->y;}}Another类的对象拥有了父类(Something)的全部的数据成员及方法,而且还加上了自己的数据成员和方法。
你可以使用 $obj2=newAnother;$obj2->setY(5);echo$obj2->getY();PHP只支持单继承,所以你不能从两个或两个以上类派生出新的类来。你可以在派生类中重定义一个方法,如果我们在Another类中重定义了getX方法(方法重写),我们就不能使 用Something中的getX方法了。如果你在派生类中声明了一个与基派同名的数据成员,那么当你处理它时, 它将“隐藏”基类的数据成员。
你可以在你的类中定义构造函数。构造函数是一个与类名同名的方法,当你创建一个类的对象时会被调用,例如: classSomething{private$x=null;//新版本的构造函数放弃使用类名,而统一使用__construct()publicfunction__construct($x){$this->x=$x;}publicfunctionsetX($v){$this->x=$v;}publicfunctiongetX(){return$this->x;}//析构函数publicfunction__destruct(){}}所以你可以创建一个对象,通过: $obj=newSomething(6);构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数(”__“两个下划线,魔术方法),所以你可以使用缺省参数。 publicfunction__construct($x=3,$y=5){}接着: $obj=newSomething();//x=3andy=5$obj=newSomething(8);//x=8andy=5$obj=newSomething(8,9);//x=8andy=9缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果传入的参数少于要求的参数时,其作的将使用缺省参数。
当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基类的构造函数,你必须要在派生类的构造函数中用parent::__construct()调用。可以这样做是在派生类中所有父类的方法都是可用的。 classAnotherextendsSomething{publicfunction__construct(){parent::__construct(5,6);//显示调用基类构造函数}}OOP的一个很好的机制是使用抽象类。抽象类是不能实例化,只能提供给派生类一个接口。设计者通常使用抽象类来强迫程序员从基类派生,这样可以确保新的类包含一些期待的功能。在PHP中没有标准的方法,但是:如果你需要这个特性,可以通过定义基类,并在它的构造函数后加上die 的调用,这样就可以保证基类是不可实例化的,在每一个方法(接口)后面加上die 语句,所以,如果一个程序员在派生类中没有覆盖方法,将引发一个错误。而且因为PHP 是无类型的,你可能需要确认一个对象是来自于你的基类的派生类,那么在基类中增加一个方法来实义类的身份(返回某种标识id),并且在你接收到一个对象参数时校验这个值。当然,如果一个不好的邪恶程序员在派生类中覆盖了这个方法,这种方法就不起作用了,不过一般问题多在懒惰的程序员身上,而不是邪恶的程序员。
当然,能够让基类对程序员无法看到是很好的,只要将接口打印出来做他们的工作就可以了。PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
重载(与覆盖不同)在PHP中不支持,因为PHP是弱类型语言。在OOP中,你可以重载一个方法来实现两个或重多的方法具有相同的名字,但是有不同数量或类型的参数(这要看语言)。PHP 是一种松散类型的语言,所以通过类型重载不起作用,然而通过参数的个数不同来重载也不起作用。
有时在OOP中重载构造函数非常好,这样你可以通过不同的方法创建对象(变量函数)。在PHP中实现它的技巧是: classMyclass{publicfunctionMyclass(){$name=Myclass.func_num_args();//这个函数返回的是传过来参数的个数$this->$name();//这里使用的是一个变量函数,以这个变量的值作为函数的名称调用}publicfunctionMyclass1($x){//code}publicfunctionMyclass2($x,$y){//code}}通过在类中的额外的处理,使用这个类对用户是透明的: $obj1=newMyclass('1');//将调用Myclass1$obj2=newMyclass('1','2');//将调用Myclass2有时这个非常好用。
多态
多态是对象的一种能力,它可以在运行时刻根据传递的对象参数,决定调用哪一个对象的方法。例如,如果你有一个figure的类,它定义了一个draw的方法。并且派生了circle和rectangle 类,在派生类中你覆盖了draw方法,你可能还有一个函数,它希望使用一个参数x,并且可以调用$x->draw()。如果你有多态性,调用哪个draw方法就依赖于你传递给这个函数的对象类型。
多态性在象PHP这样的解释语言(想象一下一个C++编译器生成这样的代码,你应该调用哪一个方法?你也不知道你拥有的对象是什么类型的,好,这不是重点)是非常容易和自然的。所以PHP当然支持多态性。 classCalc{functionniceDrawing($x){//假设这是Board类的一个方法$x->draw();}}classCircle{publicfunctiondraw(){echo画了一个圆;}}classRectangle{publicfunctiondraw(){echo画了一个矩形;}}$board=newCalc;$obj=newCircle(3,187);$obj2=newRectangle(4,5);$board->niceDrawing($obj);//将调用Circle的draw方法$board->niceDrawing($obj2);//将调用Rectangle的draw方法用PHP进行面向对象编程
一些纯化论者(purists)可能会说PHP不是一个真正的面向对象的语言,这是事实。PHP 是一个混合型语言,你可以使用OOP,也可以使用传统的过程化编程。然而,对于大型项目,你可能想/需要在PHP 中使用纯的OOP去声明类,而且在你的项目只用对象和类。
随着项目越来越大,使用OOP可能会有帮助,OOP代码很容易维护,容易理解和重用。这些就是软件工程的基础。在基于web的项目中应用这些概念就成为将来网站成功的关键。
高级OOP技术
在看过基本的OOP概念后,我就可以向你展示更高级的技术:
序列化(Serializing)
PHP不支持永久对象,在OOP中永久对象是可以在多个应用的引用中保持状态和功能的对象,这意味着拥有将对象保存到一个文件或数据库中的能力,而且可以在以后装入对象。这就是所谓的序列化机制。PHP 拥有序列化方法,它可以通过对象进行调用,序列化方法可以返回对象的字符串表示。然而,序列化只保存了对象的成员数据而不包括方法。
在PHP4中,如果你将对象序列化到字符串$s中,然后释放对象,接着反序列化对象到$obj,你可以继续使用对象的方法!我不建议这样去做,因为(a)文档中没有保证这种行为在以后的版本中仍然可以使用。(b) 这个可能导致一种误解,在你把一个序列化后的版本保存到磁盘并退出脚本时。当以后运行这个脚本时,你不能期待着在反序列化一个对象时,对象的方法也会在那里,因为字符串表示根本就不包括方法。
总而言之,PHP 进行序列化对于保存对象的成员变量非常有用。(你也可以将相关数组和数组序列化到一个文件中)。
例子 : $obj=newClassfoo();$str=serialize($obj);//保存$str到磁盘上$obj2=unserialize($str);//几个月以后//从磁盘中装入str你恢复了成员数据,但是不包括方法(根据文档所说)。这导致了只能通过类似于使用$obj2->x来存取成员变量(你没有别的方法!)的唯一办法,所以不要在家里试它。
有一些办法可以解决这个问题,我把它留着,因为对这篇简洁的文章来说,他们太不好。我会很高兴地欢迎在PHP的后续版本中有全序列化的特性。
使用类进行数据存储PHP和OOP一件非常好的事情就是,你可以很容易地定义一个类来操作某件事情,并且无论何时你想用的时候都可以调用相应的类。假设你有一个HTML表单,用户可以通过选择产品ID号来选择一个产品。在数据库中有产品的信息,你想把产品显示出来,显示它的价格等等。你拥有不同类型的产品,并且同一个动作可能对不同的产品具有不同的意思。例如,显示一个声音可能意味着播放它,但是对于其它种类的产品可能意味着显示一个存在数据库中的图片。你可以使用OOP或PHP来减少编码并提高质量:
定义一个产品的类,定义它应该有的方法(例如:显示),然后定义对每一种类型的产品的类,从产品类派后出来(SoundItem类,ViewableItem类,等等),覆盖在产品类中的方法,使它们按你的想法动作。
根据数据库中每一种产品的类型(type)字段给类命名,一个典型的产品表可能有(id,type,price,description,等等字段)...然后在处理脚本中,你可以从数据库中取出type值,然后实例化一个名为type的对象: $obj=new$type();$obj->action();这是PHP的一个非常好的特性,你可以不用考虑对象的类型,调用$obj的显示方法或其它的方法。使用这个技术,你不需要修改脚本去增加一个新类型的对象,只是增加一个处理它的类。
这个功能很强大,只要定义方法,而不去考虑所有对象的类型,在不同的类中按不同的方法实现它们,然后在主脚本中对任意对象使用它们,没有if...else,也不需要两个程序员,只有高兴。
你同意编程是容易的,维护是便宜的,可重用是真的吗?
如果你管理一组程序员,分配工作就是很简单的了,每个人可能负责一个类型的对象和处理它的类。
可以通过这个技术实现国际化,根据用户所选的语言字段应用相应的类就可以了,等等。
拷贝和克隆
当你创建一个$obj的对象时,你可以通过$obj2=$obj来拷贝对象,新的对象是$obj的一个拷贝(不是一个引用),所以它具有$obj在当时的状态。有时候,你不想这样,你只是想生成一个象obj类一样的一个新的对象,可以通过使用new语句来调用类的构造函数。在PHP中也可以通过序列化,和一个基类来实现,但所有的其它类都要从基类派生出来。
进入危险区域
当你序列化一个对象,你会得到某种格式的字符串,如果你感兴趣,你可以调究它,其中,字符串中有类的名字(太好了!),你可以把它取出来,象: $herring=serialize($obj);$vec=explode(':',$herring);//以:为标识符把字符串拆分成一个数组$nam=str_replace(,'',$vec[2]);所以假设你创建了一个Universe的类,并且强制所有的类都必须从universe扩展,你可以在universe 中定义一个clone的方法,如下: classUniverse{//在新的PHP版本中克隆(__clone())是一个魔术方法,不要和这个方法搞混了functionclone(){$herring=serialize($this);$vec=explode(':',$herring);$nam=str_replace(,'',$vec[2]);$ret=new$nam;return$ret;}}//然后$obj=newSomething();//从Universe扩展$other=$obj->clone();你所得到的是一个新的Something类的对象,它同使用new方法,调用构造函数创建出的对象一样。我不知道这个对你是否有用,但是Universe类可以知道派生类的名字是一个好的经验。想象是唯一的限制。
模板引擎 Smarty:Smarty的特点是将模板编译成PHP脚本,然后执行这些脚本。很快,非常方便。 Heyes Template Class:一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离。 FastTemplate:一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理。 ShellPage:一个简单易用的类,可以让你的整个网站布局基于模板文件,修改模板就能改变整个站点。 STP Simple Template Parser:一个简单、轻量级并且易于使用的模板分析类。它可以从多个模板中组装一个页面,把结果页面输出到浏览器或者文件系统。 OO Template Class:一个你可以用在自己程序中的面向对象的模板类。 SimpleTemplate:一个可以创建和结构化网站的模板引擎。它可以解析和编译模板。 bTemplate:短小但是快速的模板类,允许你把PHP逻辑代码从HTML修饰代码中分离。 Savant:一个强大且轻量级的PEAR兼容模板系统。它是非编译型的,使用PHP语言本身做为它的模板语言。 ETS - easy template system:可以使用完全相同数据重组模板的模板系统。 EasyTemplatePHP:适用于你的站点的一个简单但是强大的模板系统。 vlibTemplate:一个快速、全能的模板系统,它包含一个缓存和调试类。 AvanTemplate:多字节安全的模板引擎,占用很少系统资源。它支持变量替换,内容块可以设置显示或隐藏 Grafx Software’s Fast Template:一个修改版本的Fast Template系统,它包括缓存功能,调试控制台以及沉默去除为赋值块。 TemplatePower:一个快速、简单、功能强大的模板类。主要功能有嵌套的动态块支持,块/文件包含支持以及显示/隐藏未赋值的变量。 TagTemplate:这个库的功能被设计来使用模板文件,同时允许你从HTML文件检索信息。 htmltmpl: templating engine:一个适用于Python和PHP的模板引擎。它面向希望在项目中分离代码和设计的web应用开发人员。 PHP Class for Parsing Dreamweaver templates:一个分析Dreamweaver模板的简单类,被用于Gallery 2 和WordPress的自定义模块中。 MiniTemplator (Template Engine):针对HTML文件的一个紧凑型模板引擎。对于模板变量和块定义它具有简单的语法。其中块可以嵌套。 Layout Solution:简化网站开发和维护。它拥有常用的变量和页面元素使你不需要重复做页面布局工作。 Cached Fast Template:它已经纳入 FastTemplate ,允许你缓存模板文件,甚至可以在分离的块内容上缓存不同的规格。 TinyButStrong:一个支持MySQL,Odbc,Sql-Server和ADODB的模板引擎。它包含7个方法和两个属性。 Brian Lozier’s php based template engine:只有2K大小,非常快并且是面向对象设计。 WACT:一个从设计中分离代码的模板引擎。 PHPTAL:一个PHP下面的XML/XHTML模板库。 Rong_View_Wudimei:Wudimei开发的国产框架Rong Framework的模板引擎,它类似于smarty,优点是速度快,缺点是模板标签较少,不过够用了。 框架介绍thinkphp
ThinkPHP是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。
PHP认证级别
PHP课程由初级(IFE)、中级(IPE)和高级(IAE)三个部分。 IFE即Index Front-end Engineer的缩写,指数前端工程师的意思。 IPE即 Index PHP Engineer 的缩写,意思是指数PHP工程师。 IAE即 Index architecture/advanced engineer 的缩写,意思是:指数高级/架构工程师。 PHP安全
PHP其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽。常见的web安全漏洞有:注入攻击,跨站攻击,服务器自身漏洞等,对应的详细解释,详见:扩展阅读中的《WEB安全性-2010_OWASP_TOP10》,这里有很详尽的解释。
PHP的优点学习过程和方法
PHP的语法类似于C,Perl,ASP或者JSP。对于那些对上述之一的语言较熟悉的人来说,PHP太简单了。相反的,如果你对PHP了解较多,那么你对于其他几种语言的学习都很简单了。你只需要很短的时间内将PHP的核心语言特点全部掌握,你可能已经非常了解HTML,甚至你已经知道怎样用编辑设计软件或者手工来制作好看的WEB站点。由于PHP代码能够无障碍的添加进你的站点,在你设计和维护站点的同时,你可以很轻松的加入PHP使得你的站点更加具有动态特性。
数据库连接
PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是绝佳的组合,如果再加上Apache服务器,就是相当完美的了。你还可以自己编写外围的函数取间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。
可扩展性
就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个非程序员来说为PHP扩展附加功能可能会比较难,但是对于一个PHP程序员来说并不困难。
PHP可伸缩性
传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意这样以CGI方式安装它。内嵌的PHP可以具有更高的可伸缩性。
PHP免费安装
PHP源代码包安装版:这个版本适合已经有自己独立的网站域名、网站空间的专业网站建设用户。使用方法依然其为简单,只需三步:
第一、到官方网站:下载 PHP源代码包安装版最新版本,解压下载文件,将其中的全部内容上传到你的支持PHP的网站空间
第二、改更文件属性,请将根目录下以PHP为后缀名的文件和”/include/domain.php”和 “/attachments” 和 “/data”文件夹以及文件夹下所有的文件属性改成“可读”、“可写”、“可执行”,通常是“755”。
第三、打开你的网站根目录,系统会自动运行setup安装程序,按提示点下一步操作即可。
友情提示:当你下载我们的软件并看到这份说明时,则说明你一定是对企业网站建设有一定的需求或者你是一个网站建设技术学习者。
文件格式 对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 ?>。这是为了防止多余的空格或者其它字符影响到代码。 例如:
$foo = 'foo'; 缩进应该能够反映出代码的逻辑结果,尽量使用四个空格,禁止使用制表符TAB,因为这样能够保证有跨客户端编程器软件的灵活性。 例如: if(1==$x){$indented_code=1;if(1==$new_line){$more_indented_code=1;}}变量赋值建议保持相等间距和排列。 例如: $variable='demo';$var='demo2';每行代码长度应控制在80个字符以内,最长不超过120个字符。因为 linux 读入文件一般以80列为单位,就是说如果一行代码超过80个字符,那么系统将为此付出额外操作指令。这个虽然看起来是小问题,但是对于追求完美的程序员来说也是值得注意并遵守的规范。 每行结尾不允许有多余的空格。 Php文件记事本编辑乱码问题
一般情况下,记事本编辑器在对文件进行完编辑并保存之时,其默认编码为ANSI,中文。然则更多的时候,php在语言环境设置时语言多数为utf-8,直接保存并用于apache等http-server解析后就会出现乱码。
为此,应该注意在用记事本编辑完后可将文件用“另存为”的方式对文件进行保存,并将“文件类型”选择“所有文件”,编码与文件指定语言编码一致即可。
算数运算符
PHP 的运算符包括算术运算符、赋值运算符、比较运算符和逻辑运算符。
算数运算符:
加,减,乘,除,取模(取余)+、-、*、/、%
赋值运算符:(以下解释在许多书中有所不同)
赋值,加赋值,减赋值、乘赋值、除赋值,连字赋值
=、+=、-=、*=、/=、.=
位运算符:
位与、位或、位亦或、位非、左移、右移
&、|、^、~、<<、>>
比较运算符:
等于、全等于、不等于、不全等于、大于、小于、大于等于、小于等于
==、===、!=(<>)、!==、>、<、>=、<=
逻辑运算符:
逻辑与、逻辑或、逻辑非、逻辑亦或
&&、||、!、xor
字符串运算符:
. 连接两个字符串
⑥ PHP必须要写析构函数吗
不是必须孝腊裂的,而且如果对象销毁之前不需要进行额外的操作,官方是鼓励不写的,因局迹为写了巧闭不进行任何操作,反而会造成资源浪费。
⑦ 析构函数为什么在一创建对象时,就被自动执行了呢
人家不是废话,你程序结束了,对象自动销芹悄核毁,于是调用了你的析构函数,你可以运培在$aaa = new aaa();后面加些输出操作,看看是嫌掘不是aaa是不是刚创建就销毁了
⑧ php代码 访问者IP是中国的就跳转到中文页面,不是中国的就跳转到英文页面
可能原来服务器有读取ip所在地的接口吧,可能你那个判断不好用了
放到index.php中
<?php
include_once 'class_iplocation.php';
$ip='222.132.78.170';
$iplo= new IpLocation();
$a_provinces=Array (
'0' => '河北',
'1' =>'海南',
'2' => '贵州',
'3' => '广西',
'4' => '广东',
'5' => '甘肃',
'6' => '福建',
'7' => '北京',
'8' => '安徽',
'9' => '河南',
'10' => '黑龙江',
'11' => '湖北',
'12' => '湖南',
'13' => '吉林',
'14' => '江苏',
'15' => '江西',
'16' => '辽宁',
'17' => '内蒙古',
'18' => '宁夏',
'19' => '青海',
'20' => '山东',
'21' => '山西',
'22' => '陕西',
'23' => '上海',
'24' => '四川',
'25' => '天津',
'26' => '西藏',
'27' => '新疆',
'28' => '云南',
'29' => '浙江',
'30' => '重庆',
'31' => '香港',
'32' => '澳门',
'33' => '台湾'
);
$china='';
$strs=$iplo->getlocation($ip);
//print_r($strs);
//echo $strs['country'];
foreach ($a_provinces as $ci)
{
$pos = strpos($strs['country'],$ci);
if ($pos !== false ) {
echo $ci;
$china=$ci;
break;
}
}
echo $china;
if($china!='')
$home='chinese/index.php';
else
$home='english/index.php';
echo "<script language='javascript'>window.location.href='".$home."';</script>";
?>
说明:1.qqwry.dat在qq文件夹下搜就有哦。这三个文件应该放于同一目录
2.类文件:class_iplocation.php
<?php
/**
* IP 地理位置查询类
*
* @author 马秉尧
* @version 1.5
* @right 2005 CoolCode.CN
*/
class IpLocation {
/**
* QQWry.Dat文件指针
*
* @var resource
*/
var $fp;
/**
* 第一条IP记录的偏移地址
*
* @var int
*/
var $firstip;
/**
* 最后一条IP记录的偏移地址
*
* @var int
*/
var $lastip;
/**
* IP记录的总条数(不包含版本信息记录)
*
* @var int
*/
var $totalip;
/**
* 返回读取的长整型数
*
* @access private
* @return int
*/
function getlong() {
//将读取的little-endian编码的4个字节转化为长整型数
$result = unpack('Vlong', fread($this->fp, 4));
return $result['long'];
}
/**
* 返回读取的3个字节的长整型数
*
* @access private
* @return int
*/
function getlong3() {
//将读取的little-endian编码的3个字节转化为长整型数
$result = unpack('Vlong', fread($this->fp, 3).chr(0));
return $result['long'];
}
/**
* 返回压缩后可进行比较的IP地址
*
* @access private
* @param string $ip
* @return string
*/
function packip($ip) {
// 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,
// 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串
return pack('N', intval(ip2long($ip)));
}
/**
* 返回读取的字符串
*
* @access private
* @param string $data
* @return string
*/
function getstring($data = "") {
$char = fread($this->fp, 1);
while (ord($char) > 0) { // 字符串按照C格式保存,以\0结束
$data .= $char; // 将读取的字符连接到给定字符串之后
$char = fread($this->fp, 1);
}
return $data;
}
/**
* 返回地区信息
*
* @access private
* @return string
*/
function getarea() {
$byte = fread($this->fp, 1); // 标志字节
switch (ord($byte)) {
case 0: // 没有区域信息
$area = "";
break;
case 1:
case 2: // 标志字节为1或2,表示区域信息被重定向
fseek($this->fp, $this->getlong3());
$area = $this->getstring();
break;
default: // 否则,表示区域信息没有被重定向
$area = $this->getstring($byte);
break;
}
return $area;
}
/**
* 根据所给 IP 地址或域名返回所在地区信息
*
* @access public
* @param string $ip
* @return array
*/
function getlocation($ip) {
if (!$this->fp) return null; // 如果数据文件没有被正确打开,则直接返回空
$location['ip'] = gethostbyname($ip); // 将输入的域名转化为IP地址
$ip = $this->packip($location['ip']); // 将输入的IP地址转化为可比较的IP地址
// 不合法的IP地址会被转化为255.255.255.255
// 对分搜索
$l = 0; // 搜索的下边界
$u = $this->totalip; // 搜索的上边界
$findip = $this->lastip; // 如果没有找到就返回最后一条IP记录(QQWry.Dat的版本信息)
while ($l <= $u) { // 当上边界小于下边界时,查找失败
$i = floor(($l + $u) / 2); // 计算近似中间记录
fseek($this->fp, $this->firstip + $i * 7);
$beginip = strrev(fread($this->fp, 4)); // 获取中间记录的开始IP地址
// strrev函数在这里的作用是将little-endian的压缩IP地址转化为big-endian的格式
// 以便用于比较,后面相同。
if ($ip < $beginip) { // 用户的IP小于中间记录的开始IP地址时
$u = $i - 1; // 将搜索的上边界修改为中间记录减一
}
else {
fseek($this->fp, $this->getlong3());
$endip = strrev(fread($this->fp, 4)); // 获取中间记录的结束IP地址
if ($ip > $endip) { // 用户的IP大于中间记录的结束IP地址时
$l = $i + 1; // 将搜索的下边界修改为中间记录加一
}
else { // 用户的IP在中间记录的IP范围内时
$findip = $this->firstip + $i * 7;
break; // 则表示找到结果,退出循环
}
}
}
//获取查找到的IP地理位置信息
fseek($this->fp, $findip);
$location['beginip'] = long2ip($this->getlong()); // 用户IP所在范围的开始地址
$offset = $this->getlong3();
fseek($this->fp, $offset);
$location['endip'] = long2ip($this->getlong()); // 用户IP所在范围的结束地址
$byte = fread($this->fp, 1); // 标志字节
switch (ord($byte)) {
case 1: // 标志字节为1,表示国家和区域信息都被同时重定向
$countryOffset = $this->getlong3(); // 重定向地址
fseek($this->fp, $countryOffset);
$byte = fread($this->fp, 1); // 标志字节
switch (ord($byte)) {
case 2: // 标志字节为2,表示国家信息又被重定向
fseek($this->fp, $this->getlong3());
$location['country'] = $this->getstring();
fseek($this->fp, $countryOffset + 4);
$location['area'] = $this->getarea();
break;
default: // 否则,表示国家信息没有被重定向
$location['country'] = $this->getstring($byte);
$location['area'] = $this->getarea();
break;
}
break;
case 2: // 标志字节为2,表示国家信息被重定向
fseek($this->fp, $this->getlong3());
$location['country'] = $this->getstring();
fseek($this->fp, $offset + 8);
$location['area'] = $this->getarea();
break;
default: // 否则,表示国家信息没有被重定向
$location['country'] = $this->getstring($byte);
$location['area'] = $this->getarea();
break;
}
if ($location['country'] == " CZ88.NET") { // CZ88.NET表示没有有效信息
$location['country'] = "未知";
}
if ($location['area'] == " CZ88.NET") {
$location['area'] = "";
}
return $location;
}
/**
* 构造函数,打开 QQWry.Dat 文件并初始化类中的信息
*
* @param string $filename
* @return IpLocation
*/
function IpLocation($filename = "QQWry.Dat") {
$this->fp = 0;
if (($this->fp = @fopen($filename, 'rb')) !== false) {
$this->firstip = $this->getlong();
$this->lastip = $this->getlong();
$this->totalip = ($this->lastip - $this->firstip) / 7;
//注册析构函数,使其在程序执行结束时执行
register_shutdown_function(array(&$this, '_IpLocation'));
}
}
/**
* 析构函数,用于在页面执行结束后自动关闭打开的文件。
*
*/
function _IpLocation() {
if ($this->fp) {
fclose($this->fp);
}
$this->fp = 0;
}
}
?>
⑨ 函的基础知识
函,即信;公函即公务信件。它是上下级和平行机关或不相隶属机关之间在商洽和联系工作、询问和答复问题时所使用的文体。函的特点是不受公文规定的严格限制,如不用正式文件头,也可不编文件号,有时还可不拟标题,因此用起来极为简便。
公函的用法
一、下级机关向上级机关询问一般事宜,或上级机关答复或催办下级机关有关事宜。
二、平行机关或不相隶属机关之间商洽有关事宜,
三、坦备用函来通知一般事项。如通知开一般性的会议、要求下级机关报送某项材料或统计某些数字等时,也常用公函。
四、向上级机关请示较小事宜也常用函。
函件采用书写、复印、打印、传真等传递方式均可。
公文函格式
公函由首部、正文和尾部三部分组成。其各部分的格式、内容和写法要求如下:
(一)首部。主要包括标题、主送机关两个项目内容。
1、标题。公函的标题一般有两种形式。一种是由发则磨文机关名称、事由和文种构成。另一种是由事由和文种构成。
2、主送机关。即受文并办理来函事项的机关单位,于文首顶格写明全称或者规范化简称,其后用冒号。
(二)正文。其结构一般由开头、主体、结尾、结语等部分组成。
1、开头。主要说明发函的缘由。一般要求概括交代发函的目的、根据、原因等内容,然后用“现将有关问题说明如下:”或“现将有关事项函复如下:”等过渡语转入下文。复函的缘由部分,一般首先引叙来文的标题、发文字号,然后再交代根据,以说明发文的缘由。
2、主体。这是函的核心内容部分,主要说明致函事项。函的事项部分内容单一,一函一事,行文要直陈其事。无论是商洽工作,询问和答复问题,还是向有关主管部门请求批准事项等,都要用简洁得体的语言把需要告诉对方的问题、意见叙写清楚。如果属于复函,还要注意答复事项的针对性和明确性。
一、公文概述
什么是公文?公文是公务文书的简称,它是一级机关在行政管理过程中为处理公务而按规定格式制作的书面材料。
公文是党组织、国家机关、企业、事业、团体、学校等在党务活动、政务活动、技术活动和经济活动等公务活动中的产物;公文还是宣布和传达政策法令、指导工作、报告和商洽国家事务的一种工具。
公文具有直接生效的指导作用。这种指导作用包括命令作用、法律作用、执行作用、指示作用、宣传作用、教育作用、交涉作用……等等。
写作公文不能离开政策和法律,必须符合党和政府的方针、政策和法规、法律。只有不断提高公文写作水平,才能不断提高办文质量,使公文发挥它的特殊的功用。
根据国务院办公厅1993年11月发布的《国家行政机关公文处理办法》规定,我国现行的国家行政机关公文分12类13种:①命令(令);②议案;③决定;④指示;⑤公告、通告;⑥通知;⑦通报;⑧报告;⑨请示; 10 批复; 11 函; 12 会议纪要。 根据中央中央办公厅1996年5月印发的《中国共产党机关公文处理条例》规定,我国现行的各级党的机关公文有14种:①决议;②决定;③指示;④意见;⑤通知;⑥通报;⑦公报;⑧报告;⑨请示; 10 批复; 11 条例; 12 规定; 13 函; 14 会议纪要。
以上两个文件是党政机关公文制发的依据,同时也成为企事业单位、社会团体、行业等选择通用公文文种的依据。当然一些专职机关,如军事、外交、经济、法律等的机构另有一些专用公文。
公文的处理程序一般包括:①收文;②分办、批办;③催办;④拟稿;⑤审核、签发;⑥编号、印发;⑦立卷(归档);⑧销毁。与写作有直接关系的是拟稿。
二、公文的格式与要素〖ht〖kh*3/4公文具有规定的格式,公文要按规定的格式写作。这样可孙信斗以保证公文的完整性、准确性和程序性,并且便于公文的处理,提高办文的工作效率。
公文的格式要素一般包括:
(一)发文机关(版头)
发文机关即公文的作者,发文机关应写机关全称或规范化的简称。同级政府、政府各部门、上级政府部门与下级政府可以联合行文,各级政府及其部门与同级常委、军队、人民团体和行使行政职能的事业单位、公司也可联合行文。几个机关联合行文,应将主办机关排列在前。
版头是发文机关的标记。目前我国使用的公文版头有以下三种:
1、由发文机关全称或规范化简称加“文件”两字组成,以大字套红居中,印在文件首页上端,俗称“大版头”。例如,“浙江省人民政府文件”、“浙江省人事厅文件”。
2、由发文机关全称或规范化简称加圆括号标注文种名称,俗称“小版头”。例如,“浙江省人民政府(通知)”、“××市教育委员会(函)”。
3、印有发文机关全称的公函纸,作为版头。
至于几个机关联合行文的,可用公文主办机关一家版头,也可用所有联合行文机关的版头。
(二)公文份号 〖ht公文份号是同一公文印制若干份时每份的顺序编号,位于版头左上角,用阿拉伯数字标识,用以掌握每份公文的流向。绝密、机密公文应标明份号。
(三)秘密等级 〖ht公文的秘密等级分为“绝密”、“机密”、“秘密”三种,由发文机关依据《中华人民共和国保守国家秘密法》及其《实施细则》、中央和国家各部、委、办、局制订的国家秘密及其密级具体范围的规定等确定,标注在版头左上角“公文份号”之下。其具体标识为“”,“”前标密级,后标保密期限。没有标上保密期限的,绝密、机密、秘密分别可按30年、20年、xx年认定。
(四)紧急程度
紧急程度是指对公文送达和办理速度的要求。紧急公文分为“特急”、“急”两种,标注在版头左上角“秘密等级”下。电报分别标注“特急”、“加急”。
(五)发文字号 〖ht发文字号是指发文机关编制的公文代号,简称文号。发文字号由发文机关代字、发文年度、发文顺序号三部分组成。其中发文年度用六角括号括入。如国务院1998年制发的第12号文件,发文字号为“国发〔1998〕12号”。发文字号位于版头与红线之间的正中处,用公函纸制发的,位于标题右上侧。几个机关联合发文,一般只标明主办机关发文字号。
(六)签发人签发人与签署不同。签署是某些需要以本机关行政首长名义发布的公文,由其签名或加盖签名章后才能发出。签发人则有两种情况:一是指机关负责人在审定文稿后签上姓名表示同意印发;二是报送上级机关的请示、报告,必须注明签发人。这里指的是后一种情况,签发人的姓名署于版头红线之上发文字号的右侧:“签发人:×××”。为使公文显得对称,发文字号应相应向左移位。重要的或涉及面广的,必须由正职或主持日常工作的副职领导人签发。
(七)标题
公文标题位于版头下面居中的位置,通常在版头与标题之间,用一红线作区别标志。如一份公文没有版头,标题置于公函纸首端机关名称下的红线稍下居中位置。
公文标题由发文机关名称、公文主题(事由)、文种三部分组成。例如,《国务院关于加强血吸虫病防治工作的决定》,这里“国务院”是发文机关;“关于加强血吸虫病防治工作”是事由;“决定”是文种。事由一般都用介词“关于”和表达主要内容的词组组成介词结构。
拟写公文标题时,应特别注意以下几点:
1、批转或转发公文的标题,一般由批转或转发机关名称、被批转或转发的公文标题、文种三部分组成。如《国务院批转国家土地管理局关于部分地方政府越权批地情况报告的通知》。批转和转发公文的标题,应杜绝出现介词和文种的重叠,如“关于”的“关于”,“通知”的“通知”。同时应注意,除批转法规性文件加书名号外,均不对原标题加书名号。
2、事由应简明确切地概括公文的主要内容。例如,某市人民政府对历年来制定的规范性文件进行清理,应予废止的共有几十件,发文时如将这些废止的规范性文件的标题全部列为事由,显然不可能,即使仅写一个,后加“等”字,也嫌过长,但概括为“废止部分规范性文件”,就显得既明确又简洁。
3、在拟写标题时,一定要准确选定和标明文种,不能自造文种。
4、标题排列要对称、美观,除字数较少的一行字标题外,两行以上的可排成宝塔形,也可排成长短一致的双平行形或三平行形。在转行时,不要把人名、地名、机关名称等专用名词乃至词拆开。
5、公文标题中除书名号的使用有明确规定外,一般不加标点符号。标题过长或中间需停顿的,可用空格或换行的方式表述。例如:
国务院关于依靠科技振兴农业
(八)主送机关
加强农业科技成果推广工作的决定
主送机关是发文机关要求对公文予以办理或答复的对方机关。除了直接面向社会发布的公文之外,公文一般均应在正文之前标题左下方顶格书写主送机关的名称。
确定主送机关应注意:
1、政府各部门应根据本级政府授权和职权规定,方可对下一级人民政府直接行文。
2、请示的公文,应坚持主送一个机关的原则,不能多头主送;除特殊情况外,不得越级请示。受双重领导的机关向上请示,应根据内容写明主送机关和抄送机关,由主送机关负责答复。除领导直接交办的事项外,请示不得直接送领导者个人。
3、批复下级请示,只能主送原请示机关(单位),对相关机关(单位),用抄送。
4、普发公文,主送机关应写规范化统称,如××省人民政府普发文件,主送机关写为“各市、县人民政府,各地区行政公署,省政府直属各单位”。
(九)正文
正文是公文的主体,是反映公文具体内容的部分。正文紧接主送机关之后,提行空两格书写。(写法见后)
(十)附件
附件是根据正文的需要附加的公文或材料,用以对正文作补充说明或提供参考资料。附件附于正文之后。
(十一)印章
印章是机关权力的象征。公文加印,是制文机关确认公文效力的凭证。印章盖于公文右下端落款处,上不压正文,下要骑年盖月。印章要清楚、端正。联合上报的非法规类公文,由主报机关加盖印章,但在首页要注明会签机关的签发人姓名。联合下发的公文,都应加盖印章。以行政首长名义行文的公文,前具职务,后盖签名章。 党的文件,有特定版头的普发性文件不加盖发文机关印章。这是与国家行政机关公文的一大不同。
(十二)成文时间
一般就是公文的签发日期,标注于正文右下方。联合行文的成文时间,以最后签发机关领导人的签发时间为准。会议讨论通过的公文,应以会议通过的日期为准,并写上会议名称及届次,以圆括号括入,标注于公文标题之下。
(十三)附注 〖ht附注用以说明在公文其它区域不便说明的各种事项。如需要加以解释的名词术语,或用于表示公文的阅读范围、使用方法等内容,标注于落款下另起一行空两格位置。其中阅读范围是对阅读对象的规定,还应用六角括号括入,如〔发至省军级〕、〔发至县团级〕等。
(十四)主题词 〖ht主题词是由对这一公文内容所述及的主题用规范的词加文种组成,以便日后按公文的主题和文种进行检索。制订公文主题词表,是为准确选用表中的词目提供方便,防止随意性。上报的公文,应标注上级机关公文主题词表中所规定的主题词。一件公文的主题词至少用两个,一般不超过七个。例如,《国务院关于深入开展企业扭亏增盈工作的通知》这一公文,主题词就有“企业”、“经营”、“效益”、“通知”四个。从这里也可归纳出,主题词必须正确无误地反映出公文的内容特征和归属类别,要有层次性,并且不要与标题混同。
(十五)抄送机关
民工抄送机关是指虽然不主办,但应该了解这件公文内容的有关机关。抄送机关名称应写在“主题词”后公文尾部的两条等长平行细实线内。
(十六)印发机关和时间
印发机关,为发文机关的办公部门;印发时间,一般为印刷时间,放在抄送机关细实线下。
以上的公文格式要素在一份公文中要根据规定,合理安排,以示公文的严肃性。随着办公自动化的逐步实现,格式要素和编排更为严格规范,同时还将新增一些格式构成要素。
三、公文正文的'写作方法
草拟公文正文必须符合以下要求:
(一)符合国家的法律、法规、规章,符合党和国家的方针、政策及有关规定。如提出新的政策规定,就要切实可行,并需另纸加以说明。
(二)情况确实,观点明确,条理清楚,层次分明,文字精练,书写工整,标点准确,篇幅力求简短。
(三)人名、地名、数字、引文准确。时间应写具体的年月日,如“1994年”不能写成“94年”。
(四)公文中的数字,在坚持同一公文中保持数字使用前后一致的前提下,除成文时间、部分结构层次序数和词、词组、惯用语、缩略语、具有修辞色彩语句中作为词素的数字必须使用汉字外,都要使用阿拉伯数字。
(五)结构层次序数,依次为“一”、“(一)”、“1”、“(1)”。
(六)公文中应使用国家法定计量单位。
(七)引用公文,应先引标题,后引发文字号,并加圆括号。
(八)用词准确、规范。使用简称时,一般应先用全称,并注明简称。
(九)请示的公文应一文一事,报告中不得夹带请示事项。
公文正文的写法主要有两条: 第一、通过叙述、说理表明目的。
公文的行文分上行文、平行文、下行文三种。不管是哪一种,公文的正文一般是分叙事、说理、目的(或结论)三个方面来写的。叙事是摆事实,说理是讲道理,目的(或结论)是指要求对方做的事,或是对某一事项所作的结论。应该通过叙述,说理表明目的。具体来说:
(一)向上级机关写请示性的公文,一般先叙述情况,再提自己的看法,最后提出要求,请上级机关审批。
(二)写陈述性的公文,一般是先陈述情况,再写做法,最后请领导机关或请上级对下一步做法给予指示。
(三)向平级机关写商洽性的公文,常常是先提出因为什么事情,再根据什么规定,最后请示协助解决所要解决的问题。
(四)向下级机关发布指示性的公文,通常是先写根据什么情况,再提应该怎样解决,最后提出具体办法,要求下级贯彻执行。
(五)写复文(对下级请示的公文的批复),一般先根据来文所要求解决的事项,再写明审核的意见,最后要求下级按批复执行。
通过叙事、说理来表明目的,就是要深入调查,真正掌握情况,进行分析、研究,使理由充足、观点正确,提出的目的既考虑到实际的需要,也考虑到可能性。因此,材料必须真实可靠,论据确凿,说理符合政策、方针,又有的放矢,实事求是。这样,公文的目的就既明确又具体。
第二、文字表达简明、确切、条理清楚。
简明,是指简洁、明确。公文除综合性报告外,采取的是一文一事制。写作时,应反复地、认真地压缩文字,去掉可有可无的空话。较长的公文也应“开门见山”。同时,公文比一般文章对明确的要求更为严格。它的用语以语体文为原则,力求通俗,能说明问题。不准使用自造的简体字。它的语言必须符合语法,还要正确地使用标点符号。 确切,是指准确、贴切。公文必须符合准确性的原则,运用概念、判断、推理要合乎逻辑。表达上既重视内容的正确性,也不忽视形式的准确性。从内容到形式,从篇章结构到用词造句,都要与主题高度均衡、统一。
条理清楚,是指公文的布局和其它文章同样重要。一切较长的公文,均应开门见山,首先提出要点,即于开端处,先用极简要文句,说明全文的目的或结论(新闻学上称为“导语”,亦即中国古人所谓“立片言以居要,乃一篇之警策”),唤起阅者注意,使阅者脑子里先得一个总概念,不得不继续看下去。然后,再作必要的解释。长的公文分为几段时,每段亦应采取此法。一份公文有几层意思或几项要求时,必须注意条理,分清层次,以数目字标明段落和项目。这样就可以使公文的正文做到纲举目张,条理分明。
构造函数
PHP5允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
注意:
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。(??和其他语言明显不同??)
例10.8.使用新标准的构造函数
classBaseClass{
function__construct(){
print"InBaseClassconstructorn";
}
}
classSubClassextendsBaseClass{
function__construct(){
parent::__construct();
print"InSubClassconstructorn";
}
}
$obj=newBaseClass();
$obj=newSubClass();
为了实现向后兼容性,如果PHP5在类中找不到__construct()函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为__construct()的方法,但它却又不是构造函数。
析构函数
PHP5引入了析构函数的概念,这类似于其它面向对象的语言,如C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
例10.9.析构函数示例
classMyDestructableClass{
function__construct(){
print"Inconstructorn";
$this->name="MyDestructableClass";
}
function__destruct(){
print"Destroying".$this->name."n";
}
}
$obj=newMyDestructableClass();
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用parent::__destruct()。(??和其他语言明显不同??)
注意:
析构函数在脚本关闭时调用,此时所有的头信息已经发出。
注意:
试图在析构函数中抛出一个异常会导致致命错误。