찾다

PHP中的类_PHP

Jun 01, 2016 pm 12:38 PM
message기능변하기 쉬운물체우리를

PHP中的类


我觉得自从使用PHP以来最难以理解的概念就是PHP的类。我除了正在学习MySQL一些基本知识以外对于其他的数据库引擎没有经验。此前对于OOP面向对象编程我也没有经验OOP对于我来说也是个新鲜事物但是通过对其原理以及为何如此强大的理解使我有了一定的我了解如果任何程序都用OOP来实现的话无疑会得到一个强大的程序但是对我而言如果我只是认为自己了解了其中的机制而不把这种理解应用到编程实践OOP对我来说将始终停留在纸上谈兵的层次上。于是几天前在利用常规的函数来实现一些功能时我尝试采用对象来实现我发现的确这让我的工作更加简单了于是我将这些经验写出来希望能够帮助象我一样的人们。



类说穿了就是一些变量
(OOP概念中的成员变量译者注)和一些操作处理这些变量的函数(OOP概念中的成员函数)的集合。它提供了一种在程序中以现实生活的形态来思考问题的方法换句话说就是描述了一个对象。反之一个对象或者实例就是这个类的真正实现。比如说我们要描述一辆自行车一个合适的自行车类应该含有如下变量$pedals(脚蹬)$chain(链条),$front wheel(前轮),$rear wheel后轮,$brakes(刹车), and $handl_bars(车把)。你可以参考现实生活中对一辆自行车的操作来实现你的脚本。比如可以通过向函数Accelerate()传递一个$Braking_Force并将这个变量应用于你所定义的实例的其他变量如$front_wheel, $rear_wheel也可以返回操作的结果从而实现相应的操作。



看起来很美
但是这些通过常规的函数和变量不是也能够实现吗不错如果你的程序中只有一个自行车的实例为它单独定义一个类的确意思不大但是如果你需要很多自行车实例的时候呢但是你程序中的变量传递流会变得相当复杂你得时时保证每个自行车实例指定的变量都正确的传递给了不同的函数。但是使用对象大大降低了你所传递的变量的数量因为对象中的处理函数(所谓的方法method,译者著。)自动的认定作用范围就限制在本对象之内那么它所能够操作的对象也就限制在了对象范围内。而且对象的定义可以非常容易的包含到不同的脚本只用在得到可重用性的同时还从而保证了每一个自行车的在不同的脚本中工作方式都是一致的。



让我们来创建一个实际的类
这个类我几乎用在了我站点的每一个页面中也许你会从中发现值得参考的东西。



我不知道你是什么情况
但是对我来说当我写一个动态Web页面的时候我最痛恨的就是时不时要中断对程序流程的思考转而思考HTML的合适的表现格式。这样做的结果就是使我最终作出来的页面缺少吸引力因为我没有那么多的精力去顾及字体、字号、背景、以及文字的颜色。解决方法就是通过PHP类来实现对文本的格式化从而实现HTML的输出属性定制。





我把这个类命名为“Style”。其中包含了如下一些对于设置HTML属性至关重要成员变量







class Style {



var $text;

var $alink;

var $vlink;

var $link;

var $bgcol;

var $face;

var $size;

var $align;

var $valign;



}



?>



我想你已经对于HTML语法相当熟悉了
以上的变量名就是他们在HTML语法中的名字。接下来我为类Style创建一个名称为Style的成员函数。






class Style {



function Style ($text= "#000000",$alink= "#AA00AA",$vlink= "#AA00AA",$link= "#3333FF",$bgcol= "#999999",$face= "Book Antiqua",$size=3,$align= "CENTER",$valign= "TOP") {



$this->text=$text;

$this->alink=$alink;

$this->vlink=$vlink;

$this->link=$link;

$this->bgcol=$bgcol;

$this->face=$face;

$this->size=$size;

$this->align=$align;

$this->valign=$valign;



}



}

?>



当你在类中创建一个与类同名的成员函数时
这个函数会在你每次创建一个类的实例的时候被执行该函数称为构造函数。我利用这个机制来使实现在每次创建一个对象的时候自动的为每个HTML属性变量赋予一个缺省值。



= new Style; ?>



上面的语法
"=new ClassName;”就是为类Style声明了一个实例$Basic。



你可以在声明一个类的实例的同时,通过传递参数的形式为类中的某个变量指定不同的值。但是即使你声明只修改其中一个变量,也得通知指定其他成员变量的值。从这一点来说,类和常规函数是相同的。比如说你要为Style类中的text变量指定一个缺省值以外的值,其他的变量你也要指定一遍。不过这还有更简单的方法(实际上这就是通常使用的方法,没有什么新鲜的—译者注),就是通过在类中加一个成员函数来改变其中类中某个变量的值:






Function Set($varname,$value) {



$this->$varname=$value;



}



?>



然后,我们通过如下的代码就可实现对一个对象实例中指定变量值的修改。



Set( 'size', '2'); ?>



你必须使用”->”操作符以声明是一个对象的变量或函数。上面的代码就是告诉代码解释器”运行$Basic中的Set()成员函数”。解释器就会知道,$Basic就是类Style的一个实例,因为我们此前已经声明过了。同样我们可以通过如下代码引用一个实例的变量(如:$Basic->text)



让我们创建一个表头样式对象,其属性与缺省值有些不同。






$Theader= new Style;

$Theader->Set( 'text', '#0000FF');

$Theader->Set( 'bgcol', '#000000');



?>



到在这里,够好了吧?现在我的表格头有了蓝色的文字和黑色的北京。我还想要我的表体相对于我的主页而言有些轻灰,文字用黑色的,而表体中的文字要小一些,于是我可以:






$Tbody=new Style;

$Tbody->Set( 'bgcol', '#AAAAAA');

$Tbody->Set( 'size',2);



?>



相当不错,现在我们还能够用他来作什么呢?问得好!我很高兴你会问这个问题。我们需要在类中再创建几个成员函数来是Style可以用到任何HTML页面对象中。首先我要做的就是,为我的页面设置属性,于是:






function Body() {



PRINT "
BODY BGCOLOR="$this->bgcol" ".

"
TEXT="$this->text" ".

"
LINK="$this->link" VLINK="$this->vlink" ".

"
ALINK="$this->alink"> ";



}



?>



上述代码,为我站点中的所有页面设置了整体风格。其中还设计到了一个变量”$this”。我们在类中只用这个变量,解释器会自动将其理解为我们在引用当前对象本身的一个成员变量。换句话说,$this变量在应用中与对象名称(如本例中的$Basic)是等义的。你应该注意到我们在此所做的的确要比用常规函数来实现来得简单。我们可以不用向函数传递变量而在函数中引用这个变量。而通常,常规函数是通过几个全程变量数组才能够实现这种机制的。不过需要声明的是,所有对象的变量和成员函数的作用域都是在本对象范围以内的。



试验以下下面的PHP代码(假设你已经包含了Style类,并为其创建了一个实例$Basic,然后页面中已经有了 和 标签)



Body(); ?>



这样我们就可以输出一些东西到页面中了,我们可以采用传统的方法,但我想做点不同的….(这个作者故弄玄虚,幽默过头了—译者注)这就是我用的另外一个成员函数TextOut:






function TextOut($message= "
") {



PRINT "
"text">$message ";



}



?>



这个函数需要一个参数$message,$message是你要输出的文字,该函数会以指定的属性输出这些文字。我们可以通过如下方法实现:






$Basic->TextOut( 'This is my test message');

$Tbody->TextOut( ' -- kinda neat, huh?');



?>



注意,由于这两个函数中间没有输出回车换行
,所以结果将输出到同一行上。而我还想要第二部分的字体更小一点,这个我在上面的$Tbody对象中已经声明了,这样比较安全,$Tbody与$Basic唯一的不同还有个$bgcol属性,在这里没有用到。注意到了程序声明中的” ”吗?这是用来在没有参数传递给函数时函数,函数就输出缺省的不间断空格,原因后述。



到目前为止,我们的工作还没有保存。最后的一个例子说明如何通过一种简单的方法,来修改字体的颜色和或大小,即使在一个输出语法的中间,也不需要改动整个类。我们加入如下的代码:






function TDOut ($message= "
",$colspan=1) {



PRINT "
TD COLSPAN=$colspan BGCOLOR="$this->bgcol" ".

"
ALIGN="$this->align" VALIGN="$this->valign">";

$this->TextOut($message);

PRINT "
/TD>

";



}



?>



那么,讲解就到此为止!记住我想让我的表格有不同的背景颜色,我可以这样实现:










$Theader->TDOut( "Name",2);

$Theader->TDOut( "
Location",3);



?>








$Theader->TDOut( "Last");

$Theader->TDOut( "
First");

$Theader->TDOut( "
City");

$Theader->TDOut( "
State/Province");

$Theader->TDOut( "
Country");



?>





这里,你可以看到colspan参数是如何起作用的,如果没有声明,将会有个缺省值1。于是在第一个行“Name”中,合并了2列;Location行合并了3列。第二行,所有的列都被合并成了一个。



我们通过如下方式来实现表体:








$Tbody->TDOut( "Kreisler");

$Tbody->TDOut( "
Rod");

$Tbody->TDOut( "
Cortlandt");

$Tbody->TDOut( "
New York");

$Tbody->TDOut( "
USA");

?>





但看起来似乎仍然有些繁琐,我们是否可以节省更多的步骤?那么采用下面的函数:






function TROut($message) { /*And NO comments about fish, please! ;) */



PRINT "TR>

";

$cells=explode( "
|",$message);

$iterations=count($cells);

$i=0;

while ($i
list($message,$span)=explode( "
:",$cells[$i]);

if (strlen($message) ";

if ($span){

$this->TDOut ($message,$span);

}else{

$this->TDOut ($message);

}

$i++;

}

PRINT "
/TR>

";



}



?>



WOW!看起来有些繁琐,我们来分解一下:



第3行根据”|”符号分解一个字符串,并且将分解出来的每个元素都放到数组$cell中。第四行取得数组的中数组元素的个数到$iterations;第6行开始一个循环处理数组中的每个元素。第7行以”:”作为分隔符分解一个数组元素,将其存储到$message和$span中。第8行检查$message是否有值。如果没有就赋一个缺省值。第九行检查有没有$span(就是合并不合并单元格,通过$cell数据中冒号后还有$span来要确定),如果是这样,第10行调用TDOut函数,传递$message和单元格个数参数;如果没有第12行程序单纯输出$message信息(TDOut函数就用缺省值1来设置$colspan属性)。最后,我们结束一个表格行(通过)。



或许你看了还有些糊涂(不糊涂才怪),到底如何传递给TROut参数才能包括所有的必要信息?正确地格式就是:celldata[:colspan]|celldata[:colspan]|......celldata[:colspan](用|分隔单元格,单元格中数据后跟:号分隔的合并单元格的数目来指定要扩展本单元格的个数—译者注。)



所以,总结一下我们以前所作的工作,表头和表体可以通过下面的调用来完成:







$Theader->TROut( "Name:2|Address:3");

$Theader->TROut( "
First|Last|City|State/Province|Country");

$Tbody->TROut( "
Rod|Kreisler|Cortlandt|New York|USA");

?>





Wow!是不是非常的简单?(实际上的确非常简单,但是这个作者写的还不足以让人认识到这一点。也就是说给的例子缺乏说服力,我个人就觉得依靠TROut这行代码,输出一个行还不如样式表来得简单。作者起码用一个BBS的例子来说明OOP在PHP中的用处才有意义。当然了,作为PHP中OOP的入门课程,本文也算生动了,而且各个方面讲得也差不多。)。



如果有单元格中的数据存放在变量中的情况怎么办?只要Join数组就可以了:






$message=join($arry, "
|");

$Tbody->TROut($message);



?>



当然,你不能在一个Join中同时输入列扩展的单元格数,但是你可以再用一个。假设你的数组包含6个元素,第3和第4行分别要扩展2个和3个单元格,你可以通过如下代码实现将:#扩展格数参数指定到$message中



$newarray=$arry;

$newarray[2]=join(list($newarray[2],"
2"),":");

$newarray[4]=join(list($newarray[4],"
3"),":");

$message=join($newarray,"
|");

$Tbody
->TROut($message);



显然
你可以加入更多的成员函数。如果有人有更好的想法可以Email给我我会封装更多的代码并发表出来。



--这篇文章由李波先生翻译。在此向他表示诚挚的谢意--

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP의 초록 클래스 또는 인터페이스에 대한 특성과 언제 특성을 사용 하시겠습니까?PHP의 초록 클래스 또는 인터페이스에 대한 특성과 언제 특성을 사용 하시겠습니까?Apr 10, 2025 am 09:39 AM

PHP에서, 특성은 방법 재사용이 필요하지만 상속에 적합하지 않은 상황에 적합합니다. 1) 특성은 클래스에서 다중 상속의 복잡성을 피할 수 있도록 수많은 방법을 허용합니다. 2) 특성을 사용할 때는 대안과 키워드를 통해 해결할 수있는 방법 충돌에주의를 기울여야합니다. 3) 성능을 최적화하고 코드 유지 보수성을 향상시키기 위해 특성을 과도하게 사용해야하며 단일 책임을 유지해야합니다.

DIC (Dependency Injection Container) 란 무엇이며 PHP에서 사용하는 이유는 무엇입니까?DIC (Dependency Injection Container) 란 무엇이며 PHP에서 사용하는 이유는 무엇입니까?Apr 10, 2025 am 09:38 AM

의존성 주입 컨테이너 (DIC)는 PHP 프로젝트에 사용하기위한 객체 종속성을 관리하고 제공하는 도구입니다. DIC의 주요 이점에는 다음이 포함됩니다. 1. 디커플링, 구성 요소 독립적 인 코드는 유지 관리 및 테스트가 쉽습니다. 2. 유연성, 의존성을 교체 또는 수정하기 쉽습니다. 3. 테스트 가능성, 단위 테스트를 위해 모의 객체를 주입하기에 편리합니다.

SPL SplfixedArray 및 일반 PHP 어레이에 비해 성능 특성을 설명하십시오.SPL SplfixedArray 및 일반 PHP 어레이에 비해 성능 특성을 설명하십시오.Apr 10, 2025 am 09:37 AM

SplfixedArray는 PHP의 고정 크기 배열로, 고성능 및 메모리 사용이 필요한 시나리오에 적합합니다. 1) 동적 조정으로 인한 오버 헤드를 피하기 위해 생성 할 때 크기를 지정해야합니다. 2) C 언어 배열을 기반으로 메모리 및 빠른 액세스 속도를 직접 작동합니다. 3) 대규모 데이터 처리 및 메모리에 민감한 환경에 적합하지만 크기가 고정되어 있으므로주의해서 사용해야합니다.

PHP는 파일 업로드를 어떻게 단단히 처리합니까?PHP는 파일 업로드를 어떻게 단단히 처리합니까?Apr 10, 2025 am 09:37 AM

PHP는 $ \ _ 파일 변수를 통해 파일 업로드를 처리합니다. 보안을 보장하는 방법에는 다음이 포함됩니다. 1. 오류 확인 확인, 2. 파일 유형 및 크기 확인, 3 파일 덮어 쓰기 방지, 4. 파일을 영구 저장소 위치로 이동하십시오.

Null Coalescing 연산자 (??) 및 Null Coalescing 할당 연산자 (?? =)은 무엇입니까?Null Coalescing 연산자 (??) 및 Null Coalescing 할당 연산자 (?? =)은 무엇입니까?Apr 10, 2025 am 09:33 AM

JavaScript에서는 NullCoalescingOperator (??) 및 NullCoalescingAssignmentOperator (?? =)를 사용할 수 있습니다. 1. 2. ??= 변수를 오른쪽 피연산자의 값에 할당하지만 변수가 무효 또는 정의되지 않은 경우에만. 이 연산자는 코드 로직을 단순화하고 가독성과 성능을 향상시킵니다.

CSP (Content Security Policy) 헤더 란 무엇이며 왜 중요한가요?CSP (Content Security Policy) 헤더 란 무엇이며 왜 중요한가요?Apr 09, 2025 am 12:10 AM

CSP는 XSS 공격을 방지하고 리소스로드를 제한하여 웹 사이트 보안을 향상시킬 수 있기 때문에 중요합니다. 1.CSP는 HTTP 응답 헤더의 일부이며 엄격한 정책을 통해 악의적 인 행동을 제한합니다. 2. 기본 사용법은 동일한 원점에서 자원을로드 할 수있는 것입니다. 3. 고급 사용량은 특정 도메인 이름을 스크립트와 스타일로드 할 수 있도록하는 것과 같은보다 세밀한 전략을 설정할 수 있습니다. 4. Content-Security Policy 보고서 전용 헤더를 사용하여 CSP 정책을 디버그하고 최적화하십시오.

HTTP 요청 방법 (Get, Post, Put, Delete 등)이란 무엇이며 언제 각각을 사용해야합니까?HTTP 요청 방법 (Get, Post, Put, Delete 등)이란 무엇이며 언제 각각을 사용해야합니까?Apr 09, 2025 am 12:09 AM

HTTP 요청 방법에는 각각 리소스를 확보, 제출, 업데이트 및 삭제하는 데 사용되는 Get, Post, Put and Delete가 포함됩니다. 1. GET 방법은 리소스를 얻는 데 사용되며 읽기 작업에 적합합니다. 2. 게시물은 데이터를 제출하는 데 사용되며 종종 새로운 리소스를 만드는 데 사용됩니다. 3. PUT 방법은 리소스를 업데이트하는 데 사용되며 완전한 업데이트에 적합합니다. 4. 삭제 방법은 자원을 삭제하는 데 사용되며 삭제 작업에 적합합니다.

HTTPS 란 무엇이며 웹 애플리케이션에 중요한 이유는 무엇입니까?HTTPS 란 무엇이며 웹 애플리케이션에 중요한 이유는 무엇입니까?Apr 09, 2025 am 12:08 AM

HTTPS는 HTTP를 기반으로 보안 계층을 추가하는 프로토콜로, 주로 암호화 된 데이터를 통해 사용자 개인 정보 및 데이터 보안을 보호합니다. 작업 원칙에는 TLS 핸드 셰이크, 인증서 확인 및 암호화 된 커뮤니케이션이 포함됩니다. HTTP를 구현할 때는 인증서 관리, 성능 영향 및 혼합 콘텐츠 문제에주의를 기울여야합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.