Posts Tagged ‘bj’

Classes and Objects in PHP5-面向对象编程 [1]

星期一, 06月 2nd, 2008

作者:Leon Atkinson 翻译:Haohappy

面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作de项目. 当源相关代码增长到一万行甚至更多de时候,每一个更动都可能导致不希望de副作用. 这种情况发生于模块间结成秘密联盟de时候,就像第一次世界大战前de欧洲.
//haohappy注:喻指模块间de关联度过高,相互依赖性太强.更动一个模块导致其它模块也必须跟着更动.
想像一下,如果有一个用来处理登录de模块允许一个信用卡处理模块来分享它de数据库连接. 当然出发点是好de,节省了进行另一个数据库连接de支出.然而有时,登录处理模块改变了其中一个变量de名字,就可能割断了两者间de协议.导致信用卡模块de处理出错,进而导致处理发票de模块出错. 很快地,体系中所有无关de模块都可能由此出错.
因此,我觉得有点戏剧性地,绝大多数程序员都对耦合和封装心存感激. 耦合是两个模块间依赖程度de量度. 耦合越少越好.我希望能够从已有de项目中抽走一个模块并在另一个新项目中使用.
我也希望在某个模块内部大规模de更动而不用担心对其他模块de影响. 封装de原则可以提供这个解决方案.模块被看待成相对独立,并且模块间de数据通信通过接口来进行. 模块不通过彼此de变量名来窥探另一个模块,它们通过函数来礼貌地发送请求.
封装是您可以在任何编程语言中使用de一个原则. 在PHP和许多面向过程de语言中,可以偷懒是很有诱惑de.没有什么可以阻止您通过模块来构建一个假想deWEB. 面向对象编程是使程序员不会违背封装原则de一种方法.

在面向对象编程中,模块被组织成一个个对象. 这些对象拥有方法和属性. 从抽象de角度来看,方法是一个对象de所做de动作,而属性是对象de特性.从编程角度来看,方法就是函数而属性是变量. 在一个理想化de面向对象体系中,每个部份都是一个对象. 体系由对象及对象间通过方法来形成de联系构成.
一个类定义了对象de属性. 如果您在烘烤一组甜饼对象,那么类将会是甜饼机. 类de属性和方法是被调用de成员. 人们可以通过说出数据成员或者方法成员来表达.

每种语言提供了不同de途径来访问对象. PHP从C 中借用概念,提供一个数据类型用来在一个标识符下包含函数和变量.最初设计PHPde时候,甚至PHP3被开发出时,PHP并不打算提供开发超过10万行相关代码de大型项目de能力.随着PHP和Zend引擎de发展,开发大型项目变得有可能,但无论您de项目规模多大,用类来书写您de脚本将可以让相关代码实现重用.这是一个好主意,特别当您愿意与别人分享您de相关代码de时候.
有关对象de想法是计算机科学上最令人兴奋de概念之一.开始很难掌握它,但我可以保证,一旦您掌握了它,用它de思维来思考将会非常自然.

filesystemobject组件的用法示例

星期一, 06月 2nd, 2008

””””””””””””””””””””””””””””””””””””

‘ CreateLyrics

‘ 目de:

‘ 在文件夹中创建两个文本文件.

‘ 示范下面de内容

‘ - FileSystemObject.CreateTextFile

‘ - TextStream.WriteLine

‘ - TextStream.Write

‘ - TextStream.WriteBlankLines

‘ - TextStream.Close

””””””””””””””””””””””””””””””””””””

Sub CreateLyrics(Folder)

Dim TextStream

Set TextStream = Folder.CreateTextFile("OctopusGarden.txt")

TextStream.Write("Octopus’ Garden ") ‘ 请注意,该语句不添加换行到文件中.

TextStream.WriteLine("(by Ringo Starr)")

TextStream.WriteBlankLines(1)

TextStream.WriteLine("I’d like to be under the sea in an octopus’ garden in the shade,")

TextStream.WriteLine("He’d let us in, knows where we’ve been — in his octopus’ garden in the shade.")

TextStream.WriteBlankLines(2)

TextStream.Close

Set TextStream = Folder.CreateTextFile("BathroomWindow.txt")

TextStream.WriteLine("She Came In Through The Bathroom Window (by Lennon/McCartney)")

TextStream.WriteLine("")

TextStream.WriteLine("She came in through the bathroom window protected by a silver spoon")

TextStream.WriteLine("But now she sucks her thumb and wanders by the banks of her own lagoon")

TextStream.WriteBlankLines(2)

TextStream.Close

End Sub

‘ GetLyrics

‘ 目de:

‘ 显示 lyrics 文件de内容.

‘ 示范下面de内容

‘ - FileSystemObject.OpenTextFile

‘ - FileSystemObject.GetFile

‘ - TextStream.ReadAll

‘ - TextStream.Close

‘ - File.OpenAsTextStream

‘ - TextStream.AtEndOfStream

‘ - TextStream.ReadLine

””””””””””””””””””””””””””””””””””””

Function GetLyrics(FSO)

Dim TextStream

Dim S

Dim File

‘ 有多种方法可用来打开一个文本文件,和多种方法来从文件读取数据.

‘ 这儿用了两种方法来打开文件和读取文件:

Set TextStream = FSO.OpenTextFile(TestFilePath & "\Beatles\OctopusGarden.txt", OpenFileForReading)

S = TextStream.ReadAll & NewLine & NewLine

TextStream.Close

Set File = FSO.GetFile(TestFilePath & "\Beatles\BathroomWindow.txt")

Set TextStream = File.OpenAsTextStream(OpenFileForReading)

Do While Not TextStream.AtEndOfStream

S = S & TextStream.ReadLine & NewLine

Loop

TextStream.Close

GetLyrics = S

End Function

设计 FileSystemObject

星期一, 06月 2nd, 2008

要用 FileSystemObject (FSO) 对象模式来编程,则:

1使用 CreateObject 方法来创建 FileSystemObject 对象.

2在新创建de对象上使用适当de方法.

3访问对象de属性.

FSO 对象模式包含在 Scripting 类型库中,该库位于 Scrrun.dll 文件中.因而,要使用 FSO 对象模式,必须把 Scrrun.dll 放在 Web 服务器de适当系统目录中.

创建 FileSystemObject 对象

首先,使用 CreateObject 对象来创建 FileSystemObject 对象, 在 VBScript 中,使用下面de相关代码来创建 FileSystemObject de一个实例:

Dim fso

Set fso = CreateObject("Scripting.FileSystemObject")

示例相关代码示范了如何创建 FileSystemObject de一个实例.

在 JScript 中,使用下面de相关代码来做同样de事情:

var fso;

fso = new ActiveXObject("Scripting.FileSystemObject");

在这两个示例中,Scripting 是类型库de名字,而 FileSystemObject 则是想要创建de对象de名字.可以只创建 FileSystemObject 对象de一个实例,而不管试图创建另一个实例de次数.

使用适当de方法

其次,使用 FileSystemObject 对象de适当方法.例如,要创建一个新de对象,则使用 CreateTextFile 或 CreateFolder (FSO 对象模式不支持驱动器de创建或删除).

要删除对象,则使用 FileSystemObject 对象de DeleteFile 和 DeleteFolder 方法,或 File 和 Folder 对象de Delete 方法.也可以使用适当de方法,来复制和移动文件与文件夹.

——————————————————————————–

注意 FileSystemObject 对象模式中de某些功能是多余de.例如,可以用 FileSystemObject 对象de CopyFile 方法,也可以用 File 对象de Copy 方法来复制文件.这两种方法功能是相同de;两种方法都能使编程灵活.

——————————————————————————–

访问现有驱动器、文件和文件夹

要访问现有驱动器、文件或文件夹,则使用 FileSystemObject 对象中de适当de "get" 方法:

GetDrive

GetFolder

GetFile

在 VBScript 中要访问现有文件:

Dim fso, f1

Set fso = CreateObject("Scripting.FileSystemObject")

Set f1 = fso.GetFile("c:\test.txt")

在 JScript 中要做同样de事情,则使用下面de相关代码:

var fso, f1;

fso = new ActiveXObject("Scripting.FileSystemObject");

f1 = fso.GetFile("c:\\test.txt");

不要对新创建de对象使用 "get" 方法,因为 "create" 函数已经返回那个对象de一个句柄.例如,如果使用 CreateFolder 方法创建了一个新de文件夹,则不要使用 GetFolder 方法来访问它de属性,如 Name、Path、Size等等.只需设一个变量给 CreateFolder 函数,来获得新创建文件夹de句柄名,然后访问它de属性、方法和事件.要在 VBScript 中这样做,则使用下面de相关代码:

Sub CreateFolder

Dim fso, fldr

Set fso = CreateObject("Scripting.FileSystemObject")

Set fldr = fso.CreateFolder("C:\MyTest")

Response.Write "Created folder: " & fldr.Name

End Sub

在 JScript 中给 CreateFolder 函数设置一个变量,则使用下面de语法:

function CreateFolder()

{

var fso, fldr;

fso = new ActiveXObject("Scripting.FileSystemObject");

fldr = fso.CreateFolder("C:\\MyTest");

Response.Write("Created folder: " fldr.Name);

}

访问对象de属性

一旦有了对象de句柄,就可以访问它de属性.例如,要获得特定文件夹de名字,首先创建该对象de一个实例,然后用适当de方法获得它de句柄(在这个例子中是 GetFolder 方法,因为该文件夹已经存在了).

在 VBScript 中,用该相关代码来获得 GetFolder 方法de一个句柄:

Set fldr = fso.GetFolder("c:\")

在 JScript 中要做同样de事情,则使用下面de相关代码:

var fldr = fso.GetFolder("c:\\");

现在,已经有了 Folder 对象de句柄,就可以检查它de Name 属性了.在 VBScript 中使用下面de相关代码来检查:

Response.Write "Folder name is: " & fldr.Name

在 JScript 中要检查 Name 属性,则使用下面de语法:

Response.Write("Folder name is: " fldr.Name);

要找出最后一次修改文件de时间,则使用下面de VBScript 语法:

Dim fso, f1

Set fso = CreateObject("Scripting.FileSystemObject")

‘ 获得要查询de文件对象.

Set f1 = fso.GetFile("c:\detlog.txt")

‘ 打印信息.

Response.Write "File last modified: " & f1.DateLastModified

在 JScript 中要找出同样de事情,则使用下面de相关代码:

var fso, f1;

fso = new ActiveXObject("Scripting.FileSystemObject");

// 获得要查询de文件对象.

f1 = fso.GetFile("c:\\detlog.txt");

// 打印信息.

Response.Write("File last modified: " f1.DateLastModified);

FileSystemObject处理文件

星期一, 06月 2nd, 2008

有两种主要de文件处理类型:

创建、添加或删除数据,以及读取文件

移动、复制和删除文件

创建文件

创建空文本文件(有时被叫做“文本流”)有三种方法.

第一种方法是用 CreateTextFile 方法. 下面de示例示范了在 VBScript 中如何用这种方法来创建文本文件:

Dim fso, f1

Set fso = CreateObject("Scripting.FileSystemObject")

Set f1 = fso.CreateTextFile("c:\testfile.txt", True)

要在 JScript 中用这种方法,则使用下面de相关代码:

var fso, f1;

fso = new ActiveXObject("Scripting.FileSystemObject");

f1 = fso.CreateTextFile("c:\\testfile.txt", true);

请考察示例相关代码,来领会如何在 FileSystemObject 中使用 CreateTextFile 方法.

创建文本文件de第二种方法是,使用 FileSystemObject 对象de OpenTextFile 方法,并设置 ForWriting 标志.在 VBScript 中,相关代码就像下面de示例一样:

Dim fso, ts

Const ForWriting = 2

Set fso = CreateObject("Scripting. FileSystemObject")

Set ts = fso.OpenTextFile("c:\test.txt", ForWriting, True)

要在 JScript 中使用这种方法来创建文本文件,则使用下面de相关代码:

var fso, ts;

var ForWriting= 2;

fso = new ActiveXObject("Scripting.FileSystemObject");

ts = fso.OpenTextFile("c:\\test.txt", ForWriting, true);

创建文本文件de第三种方法是,使用 OpenAsTextStream 方法,并设置 ForWriting 标志.要使用这种方法,在 VBScript 中使用下面de相关代码:

Dim fso, f1, ts

Const ForWriting = 2

Set fso = CreateObject("Scripting.FileSystemObject")

fso.CreateTextFile ("c:\test1.txt")

Set f1 = fso.GetFile("c:\test1.txt")

Set ts = f1.OpenAsTextStream(ForWriting, True)

在 JScript 中,则使用下面示例中de相关代码:

var fso, f1, ts;

var ForWriting = 2;

fso = new ActiveXObject("Scripting.FileSystemObject");

fso.CreateTextFile ("c:\\test1.txt");

f1 = fso.GetFile("c:\\test1.txt");

ts = f1.OpenAsTextStream(ForWriting, true);

添加数据到文件中

一旦创建了文本文件,使用下面de三个步骤向文件添加数据:

打开文本文件.

写入数据.

关闭文件.

要打开现有de文件,则使用 FileSystemObject 对象de OpenTextFile 方法或 File 对象de OpenAsTextStream 方法.

要写数据到打开de文本文件,则根据下表所述任务使用 TextStream 对象de Write、WriteLine 或 WriteBlankLines 方法.

任务 方法

向打开de文本文件写数据,不用后续一个新行字符. Write

向打开de文本文件写数据,后续一个新行字符. WriteLine

向打开de文本文件写一个或多个空白行. WriteBlankLines

请考察示例相关代码,来领会如何在 FileSystemObject 对象中使用 Write、WriteLine 和 WriteBlankLines 方法.

要关闭一个打开de文件,则使用 TextStream 对象de Close 方法.

请考察示例相关代码,来领会如何在 FileSystemObject 中使用 Close 方法.

——————————————————————————–

注意 新行字符包含一个或几个字符(取决于操作系统),以把光标移动到下一行de开始位置(回车/换行).注意某些字符串末尾可能已经有这个非打印字符了.

——————————————————————————–

下面de VBScript 例子示范了如何打开文件,和同时使用三种写方法来向文件添加数据,然后关闭文件:

Sub CreateFile()

Dim fso, tf

Set fso = CreateObject("Scripting.FileSystemObject")

Set tf = fso.CreateTextFile("c:\testfile.txt", True)

‘ 写一行,并且带有新行字符.

tf.WriteLine("Testing 1, 2, 3.")

‘ 向文件写三个新行字符.

tf.WriteBlankLines(3)

‘ 写一行.

tf.Write ("This is a test.")

tf.Close

End Sub

这个示例示范了在 JScript 中如何使用这三个方法:

function CreateFile()

{

var fso, tf;

fso = new ActiveXObject("Scripting.FileSystemObject");

tf = fso.CreateTextFile("c:\\testfile.txt", true);

// 写一行,并且带有新行字符.

tf.WriteLine("Testing 1, 2, 3.") ;

// 向文件写三个新行字符.

tf.WriteBlankLines(3) ;

// 写一行.

tf.Write ("This is a test.");

tf.Close();

}

读取文件

要从文本文件读取数据,则使用 TextStream 对象de Read、ReadLine 或 ReadAll 方法.下表描述了不同de任务应使用哪种方法.

任务 方法

从文件读取指定数量de字符. Read

读取一整行(一直到但不包括新行字符). ReadLine

读取文本文件de整个内容. ReadAll

请考察示例相关代码,来领会如何在 FileSystemObject 中使用 ReadAll 和 ReadLine 方法.

如果使用 Read 或 ReadLine 方法,并且想跳过数据de特殊部分,则使用 Skip 或 SkipLine 方法.read 方法de结果文本存在一个字符串中,该字符串可以显示在一个控件中,也可以用字符串函数(如 Left、Right 和 Mid)来分析,连接等等.

下面de VBScript 示例示范了如何打开文件,和如何写数据到文件中并从文件读取数据:

Sub ReadFiles

Dim fso, f1, ts, s

Const ForReading = 1

Set fso = CreateObject("Scripting.FileSystemObject")

Set f1 = fso.CreateTextFile("c:\testfile.txt", True)

‘ 写一行.

Response.Write "Writing file <br>"

f1.WriteLine "Hello World"

f1.WriteBlankLines(1)

f1.Close

‘ 读取文件de内容.

Response.Write "Reading file <br>"

Set ts = fso.OpenTextFile("c:\testfile.txt", ForReading)

s = ts.ReadLine

Response.Write "File contents = ‘" & s & "’"

ts.Close

End Sub

下面de相关代码示范了在 JScript 中做同样de事:

function ReadFiles()

{

var fso, f1, ts, s;

var ForReading = 1;

fso = new ActiveXObject("Scripting.FileSystemObject");

f1 = fso.CreateTextFile("c:\\testfile.txt", true);

// 写一行.

Response.Write("Writing file <br>");

f1.WriteLine("Hello World");

f1.WriteBlankLines(1);

f1.Close();

// 读取文件de内容.

Response.Write("Reading file <br>");

ts = fso.OpenTextFile("c:\\testfile.txt", ForReading);

s = ts.ReadLine();

Response.Write("File contents = ‘" s "’");

ts.Close();

}

移动、复制和删除文件

FSO 对象模式各有两种方法移动、复制和删除文件,如下表所述.

任务 方法

移动文件 File.Move 或 FileSystemObject.MoveFile

复制文件 File.Copy 或 FileSystemObject.CopyFile

删除文件 File.Delete 或 FileSystemObject.DeleteFile

请考察示例相关代码,来领会在 FileSystemObject 中删除文件de两种方法.

下面de VBScript 示例,在驱动器 C de根目录中创建一个文本文件,向其中写一些信息,然后把它移动到 \tmp 目录中,并在 \temp 中做一个备份,最后把它们从两个目录中删掉.

要运行下面de示例,需要先在驱动器 C de根目录中创建 \tmp 和 \temp 目录:

Sub ManipFiles

Dim fso, f1, f2, s

Set fso = CreateObject("Scripting.FileSystemObject")

Set f1 = fso.CreateTextFile("c:\testfile.txt", True)

Response.Write "Writing file <br>"

‘ 写一行.

f1.Write ("This is a test.")

‘ 关闭文件.

f1.Close

Response.Write "Moving file to c:\tmp <br>"

‘ 获取 C de根目录(C:\)中de文件de句柄.

Set f2 = fso.GetFile("c:\testfile.txt")

‘ 把文件移动到 \tmp 目录.

f2.Move ("c:\tmp\testfile.txt")

Response.Write "Copying file to c:\temp <br>"

‘ 把文件复制到 \temp 目录.

f2.Copy ("c:\temp\testfile.txt")

Response.Write "Deleting files <br>"

‘ 获得文件当前位置de句柄.

Set f2 = fso.GetFile("c:\tmp\testfile.txt")

Set f3 = fso.GetFile("c:\temp\testfile.txt")

‘ 删除文件.

f2.Delete

f3.Delete

Response.Write "All done!"

End Sub

下面de相关代码示范了在 JScript 中做同样de事:

function ManipFiles()

{

var fso, f1, f2, s;

fso = new ActiveXObject("Scripting.FileSystemObject");

f1 = fso.CreateTextFile("c:\\testfile.txt", true);

Response.Write("Writing file <br>");

// 写一行.

f1.Write("This is a test.");

// 关闭文件.

f1.Close();

Response.Write("Moving file to c:\\tmp <br>");

// 获取 C de根目录(C:\)中de文件de句柄.

f2 = fso.GetFile("c:\\testfile.txt");

// 把文件移动到 \tmp 目录.

f2.Move ("c:\\tmp\\testfile.txt");

Response.Write("Copying file to c:\\temp <br>");

// 把文件复制到 \temp 目录.

f2.Copy ("c:\\temp\\testfile.txt");

Response.Write("Deleting files <br>");

// 获得文件当前位置de句柄.

f2 = fso.GetFile("c:\\tmp\\testfile.txt");

f3 = fso.GetFile("c:\\temp\\testfile.txt");

// 删除文件.

f2.Delete();

f3.Delete();

Response.Write("All done!");

}

三种禁用FileSystemObject组件的方法

星期一, 06月 2nd, 2008

众所周知,FileSystemObject组件de强大功能及破坏性是它屡屡被免费主页

提供商(那些支持ASP)de禁用de原因,我整理了一下,本来只找到两种方法,后来

被某人一刺激,硬是想到第三种不为人所知de方法,呵呵,也不知道是不是这样de.

第一种:用RegSrv32 /u C:\WINDOWS\SYSTEM\scrrun.dll(win98路径)来注销该组

件.此方法过于狠毒,属于同归于尽de方法,大家都没得用,是下招

第二种:修改Progidde值,在ASP里调用组件de方式通常是 Set 对象名=Server.

CreateObject("Progid"),这时候我就可以通过修改注册表中deProgid值从达

到禁用该组件de方法.在 开始-运行中敲入regedit,然后找到HKEY_CLASSES_ROO

T\Scripting.FileSystemObject,这时候我就可以更改该Progidde值了,如改

成Scripting.FileSystemObject8.这样在ASP页里就这样调用了:

<%@ Language=Vbscript%>

<%

Set Fs=Server.CreateObject("Scripting.FileSystemObject8")

%>

(如果您前面没有调用过该组件de话,则无须重启,就可以看到效果了,否则请重

启后看效果.)

这时候我看看还是用原来de调用方法de结果:

<%@ Language=Vbscript%>

<%

Set Fs=Server.CreateObject("Scripting.FileSystemObject")

%>

这时候de运行结果为:

服务器对象 错误 ‘ASP 0177 : 800401f3′

Server.CreateObject 失败

/aspimage/testfile2.asp, 行3

800401f3

(OK,达到我de要求)

该方法由于本人迟了两步,结果就让别人抢着回答了,这样极大de刺激了我,结

果就产生了第三种方法.

第三种:细心de高手们会想,既然能通过修改Progid值来禁用该组件,那Clsid是

否也可以来修改呢?(OK,您想得和我一样)我知道,除了CreateObject方法以

外,也可以使用一般de<object>标注建立一个组件,我可以在ASP里面使用HTM

Lde<object>标注,以便在网页中加入一个组件.方法是:

<object runat=server id=fs1 scope=page progid="Scripting.FileSystemObj

ect"></object>

Runat表示是在服务端执行,Scope表示组件de生命周期,可以选用Session,Appl

ication或page(表示当前页面,也可缺省)

这种写法对我没用,还有一种写法是:

<object runat=server id=fs1 scope=page classid="clsid:clsidde值"></obj

ect>

我也可以通过修改该Clsidde值而禁用该组件,如将注册表中HKEY_CLASSES_RO

OT\Scripting.FileSystemObject\CLSIDde值0D43FE01-F093-11CF-8940-00A0C90

54228改成0D43FE01-F093-11CF-8940-00A0C9054229(改了最后面一位),这时候de

写法为:

<object runat=server id=fs1 scope=page classid="clsid:0D43FE01-F093-11

CF-8940-00A0C9054229"></object>

看运行结果,没问题,OK.这时候我再用

<object runat=server id=fs1 scope=page classid="clsid:0D43FE01-F093-11

CF-8940-00A0C9054228"></object>

这时候就出错了.

新建一用户:iusr_domain

IIS里设置对应站点de匿名用户IUSR_DOMAIN

CACLS: 设置目录权限

这样FSO可用,但不会影响别人

FileSystemObject 对象

星期一, 06月 2nd, 2008

FileSystemObject 对象

FileSystemObject(FSO) 对象模式包含下面de对象和集合.

对象/集合 描述
FileSystemObject 主对象.包含用来创建、删除和获得有关信息,以及通常用来操作驱动器、文件夹和文件de方法和属性.和该对象相关联de许多方法,与其他 FSO 对象中de方法完全相似;它们是为了方便才被提供de.
Drive 对象.包含用来收集信息de方法和属性,这些信息是关于连接在系统上de驱动器de,如驱动器de共享名和它有多少可用空间.请注意,”drive” 并非必须是硬盘,也可以是 CD-ROM 驱动器,RAM 磁盘等等.并非必须把驱动器实物地连接到系统上;它也可以通过网络在逻辑上被连接起来.
Drives 集合.提供驱动器de列表,这些驱动器实物地或在逻辑上与系统相连接.Drives 集合包括所有驱动器,与类型无关.要可移动de媒体驱动器在该集合中显现,不必把媒体插入到驱动器中.
File 对象.包含用来创建、删除或移动文件de方法和属性.也用来向系统询问文件名、路径和多种其他属性.
Files 集合.提供包含在文件夹内de所有文件de列表.
Folder 对象.包含用来创建、删除或移动文件夹de方法和属性.也用来向系统询问文件夹名、路径和多种其他属性.
Folders 集合.提供在 Folder 内de所有文件夹de列表.
TextStream 对象.用来读写文本文件.