当前位置:  编程技术>php
本页文章导读:
    ▪PHP在XP下IIS和Apache2服务器上的安装       最近,有许多朋友问我在WindowsXp下PHP的安装过程,正好最近我在自己的机器上成功的以模块化的方式安装了PHP4.23。既然这么多朋友需要,我就以最常见的IIS和Apache服务器为例,把PHP在WindowsX.........
    ▪PHP5.0对象模型探索之抽象方法和抽象类         面向对象程序通过类的分层结构构建起来,在单重继承语言如PHP中,类的继承是树状的. 一个根类有一个或更多的子类,再从每个子类继承出一个或更多下一级子类。当然,可能存在多.........
    ▪PHP 5.0对象模型深度探索之绑定         除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问. 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。   在计算机语言.........

[1]PHP在XP下IIS和Apache2服务器上的安装
    来源: 互联网  发布时间: 2013-11-30
最近,有许多朋友问我在WindowsXp下PHP的安装过程,正好最近我在自己的机器上成功的以模块化的方式安装了PHP4.23。既然这么多朋友需要,我就以最常见的IIS和Apache服务器为例,把PHP在WindowsXP下的安装过程写出来吧,希望能对要安装PHP的朋友有点帮助。如果不加特殊说明,以下的介绍同时也适用于Win2000版本。

一、概述:

在安装之间,你必须先弄懂PHP安装的两种不同模式,一种是Cgi模式(CGI executable),另一种是模块化安装方式。可以这样来区别:在CGI模式下,如果客户机请求一个php文件,Web服务器就调用php.exe去解释这个文件,然后再把解释的结果以网页的形式返回给客户机;而在模块化中,PHP是与Web服务器一起启动并运行的,所以从某种角度上来说,以apache模块方式安装的PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。

二、软件准备:

正所谓"工欲善其事 必先利其器",要想在你的机器上运行PHP得首先准备需要的软件。

(一)WEB服务器

首先你需要一要WEB服务器来支持PHP的运行,这里我们选择两种最常见的、也是用的最多的两种服务器来分别介绍。

1.IIS(Internet Infomation Server)

IIS想必大家都不陌生吧,在Window2000中,IIS默认是被安装的。你可以通过 “开始->设置->控制面板->管理工具->Internet 信息服务”来打开它。如果你没有安装,可以通过Windows的“添加删除组件”来安装它。关于IIS的安装网上的介绍有很多,这里就不再介绍了。

2.Apache

Apache同样是一个非常优秀的Web服务器程序,同时它也是笔者最喜欢的一款Web服务器。它不仅小巧、灵活,而且在使用过程中非常稳定,不会出现一些莫名其妙的错误(IIS相对来说就差多了),更重要的一点是,它还支持把PHP安装成它的一个模块。

所以,笔者强烈推荐你用Apache来安装PHP。现在常用的Apache有两个版本,一个是1.36的版本,另一个是Apache2系列的版本,在这里推荐你使用Apache2版本,你可以在Apache的官方网站上下载到最新的版本。

Apache官方网站:http://www.apache.org

(二)PHP程序

最新的PHP程序代码你可以在它的官方网站http://www.php.net/downloads.php下载到,注意要选择那种ZIP包的,不能选择自安装那种,在写本文时,PHP最新版本是4.23版,大小是5417KB。当然你也可以在本站的下载栏目中下载到。好了。软件都准备好了,下面就开始我们的PHP安装之旅吧!

注:以下的安装过程中是以PHP4.23版本、Apache2.040为准的。

三、IIS下的安装:

1.把下载下来的PHP安装包解压到你的C盘根目录(这里选择C根目录盘是为了以后修改调试方便用,你也可以选择不同的目录),解压后应该能得到一个类似于"php-4.2.3-Win32"的目录,把目录名称改成"PHP"。

2. 打开刚才解压的PHP目录,你会发现有一个叫做"php.ini-dist"的文件,这就是PHP的配置文件了,你需要把它改名成"php.ini",然后复制到系统目录中(如果你的系统装在C盘,XP下就是"C:\windows",Windows2000下是"C:\winnt")。

以前有许多介绍PHP安装文件的文章都说要修改php.ini中"extension_dir"和"doc_root"这两项的值,可是笔者在安装PHP过程中都没有改过,也没有过任何错误,看来这两个参数不是必须的。当然如果你不放心也可以修改一下。把doc_root改成你的服务器的根目录,把extension_dir改成你的PHP安装文件夹中的extensions文件夹所在的绝对路径。

3. 打开你的IIS信息服务控制台,右击"默认网站"图标,选择属性,打开默认网站属性选择,然后再选择"主目录"选项卡

点击"配置"按钮,你会看到又跳出一个选项卡,上面是已经定义的文档类型。点击"添加"按钮,在出来的对话框的可执行文件文本框中敲入你的php.exe所在的绝对路径加上"%s %s",在这里是"c:\php\php.exe %s %s",扩展名文本框中写上你要求php程序处理的后缀名,在这里我们写入".php",下面的选项按默认设置即可。

4.好了。现在试着把下面的几段代码保存成后缀为php文件,然后放到你的一个虚拟目录中去访问,看一下是否能出现正常的结果。


phpinfo();

?>
 

 

也许你会碰到下面的输出结果:


Security Alert! The PHP CGI

cannot be accessed directly.

This PHP CGI binary was compiled

with force-cgi-redirect enabled.

This means that a page will only be

served up if the REDIRECT_STATUS CGI

variable is set,

e.g. via an Apache Action directive.

For more information as to why

this behaviour exists,

see the manual page for CGI security.

For more information about changing

this behaviour or re-enabling this webserver,

consult the installation file that

came with this distribution,

or visit the manual page.
 

 

不用怕,这是因为现在PHP在IIS中是以Cgi方式运行的,而你的php配置文件中这一项又没有打开。如果你看到上面的一段警告,你需要打开你的php.ini文件,然后查找"cgi.force_redirect = 1"这样一句,把这一句前面的分号去掉,然后把1改成0就OK了,现在再来刷新一下你刚才的页面,如果没有什么意外的话,你的屏幕上的结果应该和我下面的截屏差不多。到此,PHP在IIS上的安装过程已经完成了。

四、Apache下的安装:

我们这次采用的是Apache的一个全新版本Apache2,以前在Apache下安装PHP记得还比较麻烦,现在在Apache2平台下,我们可以方便的以模块化的方式安装PHP,前提是PHP版本必须是4.0以上的。

当然,现在还在用PHP3的已经很少了。所以这次我们只介绍如何以模块化的方式在Apache下安装PHP,如果你想了解在Apache下如何以Cgi的方式加载php,可以参考本站的另一篇文章"PHP+Apache在Win9x下的安装和配置"(http://www.hooday.com/?n=ReadArticle&a=34)。好了,闲话少说,让我们一起来领略模块化安装PHP的风采吧。

1.运行你下载的Apache2安装文件,安装Apache,安装过程中会提示你输入主机名,管理员信箱等信箱,这些信息在你安装完以后是可以修改的,所以可以放心的输入。在选择安装路径时,笔者建议你把安装路径也选成C盘的根目录。在一步步的"Next"后,你会发现Apache很容易就安装好了。

现在再看你的任务栏的右侧,应该有一个类似于这个小图标的图标,这就是Apache2的服务管理器,也是Apache1.X版本所没有的。注意这个图片的状态,如果有一个绿色的小三角,说明你的服务器已经安装成功,如果是红色的,则说明你的Apache没有安装成功,你需要进一步去找一下失败的根源。

一般最常见的错误就是端口有冲突,Apache默认的端口是80,如果你的80端口被另一个程序(如IIS)占用了的话,就会出现无法启动的情况。出现这种情况,你可以按照下面的方法来修改:点击"开始->程序->Apache HTTP Server 2.0.40->Configure Apache Server->Edit the Apache httpd.conf Configuration File"会打开一个Apache的配置文件,你可以用文本编辑器来打开它。

然后在这个文件的第120行左右,你会发现类似于"Listen 80"的字样。现在只要把这个80改成你想要的端口即可,当然在你用浏览器浏览的时候也不要忘了加上端口哦。

到了这里,你的Apache应该已经亮起绿灯了吧,下面我们来测试一下它是否在工作。打开你的浏览器,在地址栏上输入"http://localhost/"(如果你的端口不是80,需要在后面加上":端口号"),不知道你是否看到了Apache的欢迎页,笔者在这一步并没有看到,不知道什么缘故,Apache2版本好像没有默认的引导页面。如果你也没有看到,可以试着在后面加上一个文件名"index.html.en",如果能出现下面类似的页面,则说明Apache已经工作正常了。

2.好了,Apache已经安装OK了,接下来就是看如何跟PHP结合起来了。

最开始的两步和上边介绍的IIS步骤是相同的,也是解压后复制到C盘根目录,然后改名,再把PHP.ini复制到系统文件夹,如果有必要的话,修改一下"extension_dir"和"doc_root"这两项的值。上边已经说得很清楚,不再多说。

接着便是最重要的一步了,也是模块化安装的核心步骤了,可要看仔细了。

打开Apache2的配置文件(http.conf),可以通过点击"开始->程序->Apache HTTP Server 2.0.40->Configure Apache Server->Edit the Apache httpd.conf Configuration File"打开.

或者打开你的Apache安装目录下的Conf目录,你会发现一个名为http.conf的文件,就是它了,你可以用任一个文本编辑器来打开它。在这个文件的第121行左右,你应该能找到"LoadModule"字样,然后后面是一串路径,这就是Apache默认要加载的模块了,同样,咱们也可以在其后加上一句,让他来加载PHP模块。

其实,就是这么简单,你只要加上这么一句"LoadModule php4_module C:/php/sapi/php4apache2.dll",这里要解释一下"php4_module"是模块的名称,后面跟的路径则随你的PHP安装目录而变,这三个字串之间是用空格符分隔的。

接下来,还有一步工作,也是很多安装失败的朋友所忽略的,刚开始笔者也是无论如何加入上边的那一句后Apache就启动不起来了。后来经过几次试验,才发现,你的PHP安装目录下的"php4ts.dll"必须要复制到windows系统的system32目录下,否则,就不可能启动起来。

现在再试一下,是不是一切都正常了。好了,再来回顾一下我们在Apache下安装的过程。

(1)添加"LoadModule php4_module C:/php/sapi/php4apache2.dll".

(2)复制"php4ts.dll"到system32目录.

是的,就是这么简单,PHP已经运行在你的机器上了。你可以通过双击任务栏的Apache服务器图标来看到这一点。

3.再来测试一下吧。

把下面的代码保存成info.php文件放在你的Apache安装目录下的htdocs目录下。


phpinfo();

?>
 

 

然后在浏览器中敲入http://localhost/info.php(如果你的端口不是80,请在localhost/后加上":端口号"),是不是看到了类似下面的屏幕所显示的。如果是,恭喜,你已经成功的以模块化方式安装了PHP

以上在Apache部分所讲述的东西对不太熟悉Apache配置的朋友可能有一点不太明白,不过只要你按我上面所说的一步步的来,应该都不会出现什么大的毛病。如果万一不知道自己改的哪一个部分使Apache启动不起来了,你可以切换到Apache安装目录下的Conf文件夹,将http.conf文件删除掉,再将Apache的默认配置文件httpd.default.conf改名成http.conf即可。如果你想进一步的了解Apache的配置。

四、后记

PHP的安装本来就是一件很简单的事情,特别是后来所讲的以模块化安装PHP的过程。大家有时间都不妨自己试一下,这样你才能体验到成功的喜悦。

最后祝大家都能顺利的安装PHP。


    
[2]PHP5.0对象模型探索之抽象方法和抽象类
    来源: 互联网  发布时间: 2013-11-30
  面向对象程序通过类的分层结构构建起来,在单重继承语言如PHP中,类的继承是树状的. 一个根类有一个或更多的子类,再从每个子类继承出一个或更多下一级子类。当然,可能存在多个根类,用来实现不同的功能。在一个良好设计的体系中,每个根类都应该有一个有用的接口, 可以被应用代码所使用。如果我们的应用代码被设计成与根类一起工作,那么它也可以和任何一个从根类继承出来的子类合作。

  抽象方法是就像子类中一般的方法的占位符(占个地方但不起作用),它与一般方法不同—没有任何代码。如果类中存在一个或更多抽象方法, 那么这个类就成了抽象类。你不能实例化抽象类. 你必须继承它们,然后实例化子类,你也可以把抽象类看成是子类的一个模板。

  如果你覆写所有的抽象方法,子类就变成一个普通的类。如果没有覆写所有方法, 子类仍是抽象的. 如果一个类中中包含有抽象方法(哪怕只有一个), 你必须声明这个类是抽象的, 在class关键字前加上abstract。

  声明抽象方法的语法与声明一般方法不同,抽象方法的没有像一般方法那样包含在大括号{}中的主体部份,并用分号;来结束。

  在例子6.13中,我们定义了一个含有getArea方法的类Shape。但由于不知道形状不可能确定图形的面积,确良我们声明了getArea方法为抽象方法。你不能实例化一个Shape对象,但你可以继承它或在一个表达式中使用它,就像例6.13中那样。

  如果你建立了一个只有抽象方法的类,你就定义了一个接口(interface)。为了说明这种情况,PHP中有interface 和implements关键字。你可以用interface来代替抽象类,用implements来代替extends来说明你的类定义或使用一个接口,例如, 你可以写一个myClass implements myIterface. 这两种方法可以依个人偏爱来选择。

/*注:
两种方法即指:
1. abstract class aaa{} (注意aaa中只有抽象方法,没有一般方法)
class bbb extends aaa{} (在bbb中覆写aaa中的抽象方法)
2. interface aaa{}
class bbb implements aaa{} (在bbb中覆写aaa中的抽象方法)
*/

Listing 6.13 Abstract classes

//abstract root class 抽象根类
abstract class Shape
{
 abstract function getArea(); //定义一个抽象方法
}

//abstract child class 抽象子类
abstract class Polygon extends Shape //多边形
{
 abstract function getNumberOfSides();
}

//concrete class 实体类 三角形类
class Triangle extends Polygon
{
 public $base;
 public $height;

 public function getArea() //覆写计算面积方法
 {
  return(($this->base * $this->height)/2);
 }

 public function getNumberOfSides() //覆写边数统计方法
 {
  return(3);
 }
}

//concrete class 实体类四边形
class Rectangle extends Polygon
{
 public $width;
 public $height;

 public function getArea()
 {
  return($this->width * $this->height);
 }

 public function getNumberOfSides()
 {
  return(4);
 }
}

//concrete class 实体类 圆形
class Circle extends Shape
{
 public $radius;

 public function getArea()
 {
  return(pi() * $this->radius * $this->radius);
 }
}

//concrete root class 定义一个颜色类
class Color
{
 public $name;
}

$myCollection = array(); //建立形状的集合,放入数组

//make a rectangle
$r = new Rectangle;
$r->width = 5;
$r->height = 7;
$myCollection[] = $r;
unset($r);

//make a triangle
$t = new Triangle;
$t->base = 4;
$t->height = 5;
$myCollection[] = $t;
unset($t);

//make a circle
$c = new Circle;
$c->radius = 3;
$myCollection[] = $c;
unset($c);

//make a color
$c = new Color;
$c->name = "blue";
$myCollection[] = $c;
unset($c);

foreach($myCollection as $s)
{
 if($s instanceof Shape) //如果$s是Shape类的实例
 {
  print("Area: " . $s->getArea() . "n");
 }

 if($s instanceof Polygon)
 {
  print("Sides: " .$s->getNumberOfSides()."n");
 }

 if($s instanceof Color)
 {
  print("Color: $s->name n");
 }

 print("n");
}

?>


    
[3]PHP 5.0对象模型深度探索之绑定
    来源: 互联网  发布时间: 2013-11-30
  除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问. 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。

  在计算机语言中有两种主要的绑定方式—静态绑定和动态绑定。静态绑定发生于数据结构和数据结构间,程序执行之前. 静态绑定发生于编译期, 因此不能利用任何运行期的信息。它针对函数调用与函数的主体,或变量与内存中的区块。因为PHP是一种动态语言,它不使用静态绑定。但是可以模拟静态绑定。

  动态绑定则针对运行期产生的访问请求,只用到运行期的可用信息。在面向对象的代码中,动态绑定意味着决定哪个方法被调用或哪个属性被访问,将基于这个类本身而不基于访问范围。

  Public和protected成员的动作类似于PHP的前几个版本中函数的动作,使用动态绑定。这意味着如果一个方法访问一个在子类中被覆写的类成员,并是一个子类的实例,子类的成员将被访问(而不是访问父类中的成员)。

  看例子6.10. 这段代码输出” Hey! I am Son.” 因为当PHP调用getSalutation, 是一个Son的实例,是将Father中的salutation覆写而来. 如果salutation是public的,PHP将产生相同的结果. 覆写方法的操作很类似。在Son中,对于identify的调用绑定到那个方法。

  即使在子类中访问方式被从protected削弱成public, 动态绑定仍然会发生. 按照访问方式使用的原则,增强对于类成员的访问限制是不可能的,所以把访问方式从public改变成protected不可能进行。

  Listing 6.10 Dynamic binding 动态绑定

class Father
{
protected $salutation = "Hello there!"; //问候

public function getSalutation()
{
print("$this->salutationn");
$this->identify();
}

protected function identify()
{
print("I am Father.
n");
}
};

class Son extends Father
{
protected $salutation = "Hey!"; //父类中的protected $salutation 被覆写

protected function identify() //父类中的protected identify() 被覆写
{
print("I am Son.
n");
}
};

$obj = new Son();
$obj->getSalutation(); //输出Hey! I am Son.
?>

//注: 在子类中没有覆写getSalutation(),但实际上仍然存在一个getSalutation().这个类中的$salutation和identify()
//与Son子类的实例中的getSalutation()方法动态绑定,所以调用Son的实例的getSalutation()方法,
//将调用Son类中的成员salutation及identify(),而不是父类中的成员salutation及identify().

  Private成员只存在于它们所在的类内部. 不像public和protected成员那样,PHP模拟静态绑定. 看例子6.11。它输出”Hello there! I am Father.”,尽管子类覆写了salutation的值,脚本将this->salutation和当前类Father绑定. 类似的原则应用于private方法identify()。

  Listing 6.11 Binding and private members

class Father
{
private $salutation = "Hello there!";

public function getSalutation()
{
print("$this->salutationn");
$this->identify();
}

private function identify()
{
print("I am Father.
n");
}
}

class Son extends Father
{
private $salutation = "Hey!";
private function identify()
{
print("I am Son.
n");
}
}

$obj = new Son();
$obj->getSalutation(); //输出Hello there! I am Father.
?>

  动态绑定的好处是允许继承类来改变父类的行为,同时可以保持父类的接口和功能,看例子6.12. 由于使用了动态绑定,在deleteUser中被调用的isAuthorized的version 可以由对象的类型来确定。如果是一个普通的user,PHP调用User::isAuthorized会返回FALSE.如果是一个AuthorizedUser的实例,PHP调用AuthorizedUser::isAuthorized,将允许deleteUser顺利执行。

  //haohappy注:用一句话说清楚,就是对象类型与方法,属性绑定. 调用一个父类与子类中都存在的方法或访问一个属性时,会先判断实例属于哪种对象类型,再调用相应的类中的方法和属性.

  Listing 6.12 动态绑定的好处

class User //用户
{
protected function isAuthorized() //是否是验证用户
{
return(FALSE);
}

public function getName() //获得名字
{
return($this->name);
}

public function deleteUser($username) //删除用户
{
if(!$this->isAuthorized())
{
print("You are not authorized.
n");
return(FALSE);
}

//delete the user
print("User deleted.
n");
}
}

class AuthorizedUser extends User //认证用户
{
protected function isAuthorized() //覆写isAuthorized()
{
return(TRUE);
}
}

$user = new User;
$admin = new AuthorizedUser;

//not authorized
$user->deleteUser("Zeev");

//authorized
$admin->deleteUser("Zeev");
?> 

  为什么private的类成员模拟静态绑定? 为了回答这个问题, 你需要回忆一下为什么需要有private成员.什么时候用它们来代替protected成员是有意义的?

  private成员只有当你不想让子类继承改变或特殊化父类的行为时才用到,这种情况比你想像的要少, 通常来说,一个好的对象分层结构应当允许绝大多数功能被子类特殊化,改进,或改变—这是面向对象编程的基础之一。一定的情况下需要private方法或变量,例如当你确信你不想允许子类改变父类中的某个特定的部份。


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3