Home >Backend Development >PHP Tutorial >Learn PHP in one minute, PHP_PHP tutorial in one minute
PHP5 editor
After a long period of development and multiple pre-release versions of PHP5, PHP5.0 was released on July 13, 2004. This version uses Zend Engine II as the engine and adds new features such as PHP Data Objects (PDO). PHP5.0 version enhances more functions. First, it is fully object-oriented and provides a feature called PHPCompatibility Mode. Next is the XML function. The PHP5.0 version supports an XML processing interface called SimpleXML that can intuitively access XML data. At the same time, it also strengthens XMLWeb service support, and standard supports SOAP extension modules. In terms of database, the new version of PHP provides a new interface designed to access MySQL - MySQL. In addition to the previous interface, you can also use new features of MySQL such as object-oriented interface and prepared statements (Prepared Statement). In addition, PHP5.0 is also bundled with a small-capacity RDBMS-SQLite.
New Object Mode
* Constructors and destructors * References to objects * Cloning of objects * Private, public and protected modes in objects * Interfaces (Interfaces)
* Abstract class * __call * __set and __get * static members
Constructor and destructor
In PHP4, when a function has the same name as an object, this function will become the constructor of the object, and there is no concept of a destructor in PHP4.
In PHP5, the constructor is uniformly named __construct, and the concept of destructor is introduced, which is uniformly named __destruct.
Object reference
In PHP4, passing a variable to a function or method actually makes a copy of the variable, which means that what you pass to the function or method is a copy of the variable, unless you use the reference symbol " &;" is used to declare a reference, not a copy. In PHP5, objects always exist in the form of references, and assignment operations in objects are also reference operations.
Clone of object
When an object is always called as a reference, what should I do if I want to get a copy of the object? PHP5 provides a new feature, which is object cloning, with the syntax __clone.
AbstractClass
Abstract classes cannot be instantiated.
Abstract classes, like other classes, allow variables and methods to be defined.
An abstract class can also define an abstract method. The method of the abstract class will not be executed, but it may be executed in its derived class.
__call
PHP5 objects have a new special method __call(), which is used to monitor other methods in an object. If you try to call a method that does not exist on the object, the __call method will be called automatically.
__set and __get
This is a great method, the __set and __get methods can be used to capture variables and methods that do not exist in an object.
Type indication
In PHP5, you can specify in an object's method that its parameter must be an instance of another object.
Static members
Static members and static methods are called "class methods" and "class variables" in the terminology of object-oriented programming.
"Class method" is allowed to be called before an object is instantiated. Likewise, "class variables" can be controlled independently before an object is instantiated (without using an object's methods to control them).
Exception handling
Exception handling is recognized as an ideal method for handling program errors. This concept is available in Java and C. We are pleased to see that PHP5 has added applications in this area. You can try using "try" and "catch" to control program errors. When an error occurs, the code will hand over the error to the "catch" clause for handling. In the "catch" clause, you need to specify that the error is to be handed over to an object for handling. This can make the code structure look like Clearer, because we can hand over all error messages to an object to handle.
Custom error handling
You can easily use custom error handling code to control accidents in your program. You just need to derive your own error control class from the exception class. In your own error control class, you need to have a constructor and a getMessage method.
Namespace
Namespaces are useful for grouping classes or grouping functions. It can group some related classes or functions together for easy calling later.
Example: Namespace
<span> 1</span> <?<span>php </span><span> 2</span> namespacemy\name;<span>//</span><span>参考"定义命名空间"小节</span> <span> 3</span> <span>classMyClass{} </span><span> 4</span> <span>function myfunction(){} </span><span> 5</span> constMYCONST=<span>1</span><span>; </span><span> 6</span> $a=<span>newMyClass; </span><span> 7</span> $c=<span>new</span>\my\name\MyClass;<span>//</span><span>参考"全局空间"小节</span> <span> 8</span> $a=strlen(<span>'</span><span>hi</span><span>'</span>);<span>//</span><span>参考"使用命名空间:后备全局函数/常量"小节</span> <span> 9</span> $d=<span>namespace</span>\MYCONST;<span>//</span><span>参考"namespace操作符和__NAMESPACE__常量”小节</span> <span>10</span> $d=__NAMESPACE__.<span>'</span><span>\MYCONST</span><span>'</span><span>; </span><span>11</span> echo constant($d);<span>//</span><span>参考"命名空间和动态语言特征"小节</span> <span>12</span> ?>
Pay attention to the circumstances under which you need to use namespaces. In actual application, you may need to declare two or more objects with the same name to do different things. Then you can put them in different places. namespace (but the interface must be the same).
Encryption
ZendGuard encryption method is supported starting from PHP5.3. Zend Guard Loader must be installed. The old zend optimizer will not be supported.
The process of installing Zend Guard Loader support on Linux:
操作系统为CentOS5.5,PHP版本为5.3.8(CentOS5.5中的PHP默认版本较低,如果要升级到PHP最新版,可以使用remi的report源进行升级)。
Windows 下面的 Zend Guard Loader 不支持php5.3.8 VC9 x86 Thread Safe而,php5.3.8 VC9 x86 Non Thread Safe 又不支持 apache。所以安装的话,就需要安装在iis或者和nginx搭配。
1、下载最新的Linux操作系统系下的Zend Guard Loader。
2、上传至Linux服务器并解压缩,注意阅读生成目录下的README文件。全文如下(添加必要的注释)。在/etc/php.d/目录下创建文件zend.ini,内容如下:
<span>1</span> zend_extension=/usr/lib64/php/modules/ZendGuardLoader.so
注意路径一定要写上,刚开始没写路径,老是加载不上ZendGuardLoader .so,也可以直接将上面的配置写入/etc/php.ini文件中,效果一样。
3、重启httpd服务:service httpd restart。
4.输出e2d0e752df2c971bca1fcef6e50119b4
相关语法及概念
php 支持八种原始类型。
四种标量类型:boolean(布尔型) integer(整型) float(浮点型,也作“double”) string(字符串)
两种复合类型:array(数组)object(对象)
最后是两种特殊类型:resource(资源)NULL
为了确保代码的易读性,本手册还介绍了一些伪类型:mixed、number、callback
语法(例子中均忽略了PHP代码边界符 bb9bd6d87db7f8730c53cb084e6b4d2d):
注释的语法有三种:
<span>1</span> <span>//</span><span>comment这个是单行注释</span> <span>2</span> <span>/*</span><span>comment<br /> 这个是多行注释<br /></span><span> */</span><span>3</span> <span>#</span><span>comment这个是脚本类型注释,很少用</span>
基本的结构控制语句:
<span> 1</span> <span>//</span><span>分支结构(选择结构)</span> <span> 2</span> <span> 3</span> <span>if</span><span>(condition){ </span><span> 4</span> <span> 5</span> <span>//</span><span>Statement</span> <span> 6</span> <span> 7</span> <span>} </span><span> 8</span> <span> 9</span> <span>if</span><span>(condition){ </span><span>10</span> <span>11</span> <span>//</span><span>Statement</span> <span>12</span> <span>13</span> }<span>else</span><span>{ </span><span>14</span> <span>15</span> <span>//</span><span>Statement</span> <span>16</span> <span>17</span> <span>} </span><span>18</span> <span>19</span> <span>if</span><span>(condition){ </span><span>20</span> <span>21</span> <span>//</span><span>Statement</span> <span>22</span> <span>23</span> }<span>elseif</span><span>(condition){ </span><span>24</span> <span>25</span> <span>//</span><span>Statement</span> <span>26</span> <span>27</span> <span>} </span><span>28</span> <span>//</span><span>多分支结构</span> <span>29</span> <span>switch</span>(<span>$变量</span><span>){ </span><span>30</span> <span>case</span>'值': <span>31</span> <span>//</span><span>Statement</span> <span>32</span> <span>break</span><span>; </span><span>33</span> <span>case</span>'值2': <span>34</span> <span>//</span><span>Statement</span> <span>35</span> <span>break</span><span>; </span><span>36</span> <span>default</span>: <span>37</span> <span>//</span><span>Statement</span> <span>38</span> <span>} </span><span>39</span> <span>40</span> <span>//</span><span>循环结构</span> <span>41</span> <span>42</span> <span>while</span><span>(condition){ </span><span>43</span> <span>//</span><span>Statement</span> <span>44</span> <span>} </span><span>45</span> <span>46</span> <span>47</span> <span>do</span><span>{ </span><span>48</span> <span>//</span><span>Statement</span> <span>49</span> }<span>while</span><span>(condition); </span><span>50</span> <span>51</span> <span>52</span> <span>for</span><span>(初始化;判断;变化){ </span><span>53</span> <span>//</span><span>Statement</span> <span>54</span> <span>} </span><span>55</span> <span>56</span> <span>57</span> <span>//</span><span>数组遍历专用循环语句</span> <span>58</span> <span>59</span> <span>foreach</span>(<span>$Arrayas$value</span><span>){ </span><span>60</span> <span>echo</span><span>$value</span><span>; </span><span>61</span> <span>} </span><span>62</span> <span>63</span> <span>foreach</span>(<span>$Arrayas$key</span>=><span>$value</span><span>){ </span><span>64</span> <span>echo</span><span>$key</span><span>; </span><span>65</span> <span>echo</span><span>$value</span><span>; </span><span>66</span> }
一个PHP实例:
<span> 1</span> <html> <span> 2</span> <head> <span> 3</span> <title>Firstprogram</title> <span> 4</span> </head> <span> 5</span> <body> <span> 6</span> <span>//</span><span>php中string类型的拼接符和其它大多数采用"+"号运算符不一样,而是采用"."号运算 </span><span> 7</span> <span>//在一般语言中用于对象属性和方法调用的"."运算符,则和C语言的结构体一样用"=>"</span> <span> 8</span> <?<span>php </span><span> 9</span> <span>echo</span>"helloworld"."!"<span>; </span><span>10</span> ?> <span>11</span> </body> <span>12</span> </html>
php对面向对象的支持
面向对象编程的概念:
不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面:
1.抽象数据类型和信息封装
2.继承
3.多态
在PHP中是通过类来完成封装的:
<span> 1</span> <span>//</span><span>在OOP类中,通常采用大双驼峰命名法,每个单词的首字母都大写</span> <span> 2</span> <span>classSomething{ </span><span> 3</span> <span>//</span><span>作用域修饰符:public公共的;private私有的;protected受保护的; </span><span> 4</span> <span>//属性的名称一般用全小写</span> <span> 5</span> <span>private</span><span>$x</span>=<span>null</span>;<span>//</span><span>在编程建议中,内部使用的属性应该给私有修饰符,然后通过方法取值赋值 </span><span> 6</span> <span> 7</span> <span>//方法的名称一般用小驼峰命名法,第一个单词全小写,剩下的单词首字母大写 </span><span> 8</span> <span>//因为PHP不会自动为变量使用$this所以必须主动加上$this伪变量来指向操作的对象</span> <span> 9</span> publicfunctionsetX(<span>$v</span><span>){ </span><span>10</span> <span>$this</span>->x=<span>$v</span><span>; </span><span>11</span> <span>} </span><span>12</span> <span>publicfunctiongetX(){ </span><span>13</span> <span>return</span><span>$this</span>-><span>x; </span><span>14</span> <span>} </span><span>15</span> }
当然你可以按自己的喜好进行定义,但最好保持一种标准,这样会更有效。数据成员在类中使用"var"声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方法来说,它只能是局部变量。
使用new操作符来创建一个对象:
<span>$obj</span>=newSomething;
然后你可以使用成员函数通过:
<span>$obj</span>->setX(5<span>); </span><span>$see</span>=<span>$obj</span>-><span>getX(); </span><span>echo</span><span>$see</span>;
在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。继承在PHP中很容易实现,只要使用extends关键字。
<span> 1</span> <span>classAnotherextendsSomething{ </span><span> 2</span> <span>private</span><span>$y</span><span>; </span><span> 3</span> <span> 4</span> publicfunctionsetY(<span>$v</span><span>){ </span><span> 5</span> <span>$this</span>->y=<span>$v</span><span>; </span><span> 6</span> <span>} </span><span> 7</span> <span>functiongetY(){ </span><span> 8</span> <span>return</span><span>$this</span>-><span>y; </span><span> 9</span> <span>} </span><span>10</span> }
"Another"类的对象拥有了父类(Something)的全部的数据成员及方法,而且还加上了自己的数据成员和方法。
你可以使用
<span>1</span> <span>$obj2</span>=<span>newAnother; </span><span>2</span> <span>$obj2</span>->setY(5<span>); </span><span>3</span> <span>echo</span><span>$obj2</span>->getY();
PHP只支持单继承,所以你不能从两个或两个以上类派生出新的类来。你可以在派生类中重定义一个方法,如果我们在"Another"类中重定义了getX方法(方法重写),我们就不能使 用"Something"中的getX方法了。如果你在派生类中声明了一个与基派同名的数据成员,那么当你处理它时, 它将“隐藏”基类的数据成员。
你可以在你的类中定义构造函数。构造函数是一个与类名同名的方法,当你创建一个类的对象时会被调用,例如:
<span> 1</span> <span>classSomething{ </span><span> 2</span> <span>private</span><span>$x</span>=<span>null</span><span>; </span><span> 3</span> <span> 4</span> <span>//</span><span>新版本的构造函数放弃使用类名,而统一使用__construct()</span> <span> 5</span> publicfunction__construct(<span>$x</span><span>){ </span><span> 6</span> <span>$this</span>->x=<span>$x</span><span>; </span><span> 7</span> <span>} </span><span> 8</span> publicfunctionsetX(<span>$v</span><span>){ </span><span> 9</span> <span>$this</span>->x=<span>$v</span><span>; </span><span>10</span> <span>} </span><span>11</span> <span>publicfunctiongetX(){ </span><span>12</span> <span>return</span><span>$this</span>-><span>x; </span><span>13</span> <span>} </span><span>14</span> <span>15</span> <span>//</span><span>析构函数</span> <span>16</span> <span>publicfunction__destruct(){ </span><span>17</span> <span>18</span> <span>} </span><span>19</span> }
所以你可以创建一个对象,通过:
<span>$obj</span>=newSomething(6);
构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数(”__“两个下划线,魔术方法),所以你可以使用缺省参数。
publicfunction__construct(<span>$x</span>="3",<span>$y</span>="5"<span>){ }</span>
接着:
<span>$obj</span>=newSomething();<span>//</span><span>x=3andy=5</span> <span>$obj</span>=newSomething(8);<span>//</span><span>x=8andy=5</span> <span>$obj</span>=newSomething(8,9);<span>//</span><span>x=8andy=9</span>
缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果传入的参数少于要求的参数时,其作的将使用缺省参数。
当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基类的构造函数,你必须要在派生类的构造函数中用parent::__construct()调用。可以这样做是在派生类中所有父类的方法都是可用的。
<span>1</span> <span>class Another extends Something{ </span><span>2</span> <span>public function__construct(){ </span><span>3</span> parent::__construct(5,6);<span>//</span><span>显示调用基类构造函数</span> <span>4</span> <span>} </span><span>5</span> }
OOP的一个很好的机制是使用抽象类。抽象类是不能实例化,只能提供给派生类一个接口。设计者通常使用抽象类来强迫程序员从基类派生,这样可以确保新的类包含一些期待的功能。在PHP中没有标准的方法,但是:如果你需要这个特性,可以通过定义基类,并在它的构造函数后加上"die" 的调用,这样就可以保证基类是不可实例化的,在每一个方法(接口)后面加上"die" 语句,所以,如果一个程序员在派生类中没有覆盖方法,将引发一个错误。而且因为PHP 是无类型的,你可能需要确认一个对象是来自于你的基类的派生类,那么在基类中增加一个方法来实义类的身份(返回某种标识id),并且在你接收到一个对象参数时校验这个值。当然,如果一个不好的邪恶程序员在派生类中覆盖了这个方法,这种方法就不起作用了,不过一般问题多在懒惰的程序员身上,而不是邪恶的程序员。
当然,能够让基类对程序员无法看到是很好的,只要将接口打印出来做他们的工作就可以了。PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。[3]
重载(与覆盖不同)在PHP中不支持,因为PHP是弱类型语言。在OOP中,你可以重载一个方法来实现两个或重多的方法具有相同的名字,但是有不同数量或类型的参数(这要看语言)。PHP 是一种松散类型的语言,所以通过类型重载不起作用,然而通过参数的个数不同来重载也不起作用。
有时在OOP中重载构造函数非常好,这样你可以通过不同的方法创建对象(变量函数)。在PHP中实现它的技巧是:
<span> 1</span> <span>class Myclass{ </span><span> 2</span> <span>public function Myclass(){ </span><span> 3</span> <span>$name</span>="Myclass".<span>func_num_args</span>();<span>//</span><span>这个函数返回的是传过来参数的个数</span> <span> 4</span> <span>$this</span>-><span>$name</span>();<span>//</span><span>这里使用的是一个变量函数,以这个变量的值作为函数的名称调用</span> <span> 5</span> <span>} </span><span> 6</span> public function Myclass1(<span>$x</span><span>){ </span><span> 7</span> <span>//</span><span>code</span> <span> 8</span> <span>} </span><span> 9</span> public function Myclass2(<span>$x</span>,<span>$y</span><span>){ </span><span>10</span> <span>//</span><span>code</span> <span>11</span> <span>} </span><span>12</span> }
通过在类中的额外的处理,使用这个类对用户是透明的:
<span>1</span> <span>$obj1</span>=newMyclass('1');<span>//</span><span>将调用Myclass1</span> <span>2</span> <span>$obj2</span>=newMyclass('1','2');<span>//</span><span>将调用Myclass2</span>
有时这个非常好用。
多态
多态是对象的一种能力,它可以在运行时刻根据传递的对象参数,决定调用哪一个对象的方法。例如,如果你有一个figure的类,它定义了一个draw的方法。并且派生了circle和rectangle 类,在派生类中你覆盖了draw方法,你可能还有一个函数,它希望使用一个参数x,并且可以调用$x->draw()。如果你有多态性,调用哪个draw方法就依赖于你传递给这个函数的对象类型。
多态性在象PHP这样的解释语言(想象一下一个C++编译器生成这样的代码,你应该调用哪一个方法?你也不知道你拥有的对象是什么类型的,好,这不是重点)是非常容易和自然的。所以PHP当然支持多态性。
<span> 1</span> <span>classCalc{ </span><span> 2</span> functionniceDrawing(<span>$x</span>){<span>//</span><span>假设这是Board类的一个方法</span> <span> 3</span> <span>$x</span>-><span>draw(); </span><span> 4</span> <span>} </span><span> 5</span> <span>} </span><span> 6</span> <span> 7</span> <span>classCircle{ </span><span> 8</span> <span>publicfunctiondraw(){ </span><span> 9</span> <span>echo</span>"画了一个圆"<span>; </span><span>10</span> <span>} </span><span>11</span> <span>} </span><span>12</span> <span>13</span> <span>classRectangle{ </span><span>14</span> <span>publicfunctiondraw(){ </span><span>15</span> <span>echo</span>"画了一个矩形"<span>; </span><span>16</span> <span>} </span><span>17</span> <span>} </span><span>18</span> <span>$board</span>=<span>newCalc; </span><span>19</span> <span>$obj</span>=newCircle(3,187<span>); </span><span>20</span> <span>$obj2</span>=newRectangle(4,5<span>); </span><span>21</span> <span>$board</span>->niceDrawing(<span>$obj</span>);<span>//</span><span>将调用Circle的draw方法</span> <span>22</span> <span>$board</span>->niceDrawing(<span>$obj2</span>);<span>//</span><span>将调用Rectangle的draw方法</span>
用PHP进行面向对象编程
一些"纯化论者(purists)"可能会说PHP不是一个真正的面向对象的语言,这是事实。PHP 是一个混合型语言,你可以使用OOP,也可以使用传统的过程化编程。然而,对于大型项目,你可能想/需要在PHP 中使用纯的OOP去声明类,而且在你的项目只用对象和类。
随着项目越来越大,使用OOP可能会有帮助,OOP代码很容易维护,容易理解和重用。这些就是软件工程的基础。在基于web的项目中应用这些概念就成为将来网站成功的关键。
高级OOP技术
在看过基本的OOP概念后,我就可以向你展示更高级的技术:
序列化(Serializing)
PHP不支持永久对象,在OOP中永久对象是可以在多个应用的引用中保持状态和功能的对象,这意味着拥有将对象保存到一个文件或数据库中的能力,而且可以在以后装入对象。这就是所谓的序列化机制。PHP 拥有序列化方法,它可以通过对象进行调用,序列化方法可以返回对象的字符串表示。然而,序列化只保存了对象的成员数据而不包括方法。
在PHP4中,如果你将对象序列化到字符串$s中,然后释放对象,接着反序列化对象到$obj,你可以继续使用对象的方法!我不建议这样去做,因为(a)文档中没有保证这种行为在以后的版本中仍然可以使用。(b) 这个可能导致一种误解,在你把一个序列化后的版本保存到磁盘并退出脚本时。当以后运行这个脚本时,你不能期待着在反序列化一个对象时,对象的方法也会在那里,因为字符串表示根本就不包括方法。
总而言之,PHP 进行序列化对于保存对象的成员变量非常有用。(你也可以将相关数组和数组序列化到一个文件中)。
例子 :
<span>1</span> <span>$obj</span>=<span>newClassfoo(); </span><span>2</span> <span>$str</span>=<span>serialize</span>(<span>$obj</span>);<span>//</span><span>保存$str到磁盘上</span> <span>3</span> <span>$obj2</span>=<span>unserialize</span>(<span>$str</span>);<span>//</span><span>几个月以后//从磁盘中装入str</span>
你恢复了成员数据,但是不包括方法(根据文档所说)。这导致了只能通过类似于使用$obj2->x来存取成员变量(你没有别的方法!)的唯一办法,所以不要在家里试它。
有一些办法可以解决这个问题,我把它留着,因为对这篇简洁的文章来说,他们太不好。我会很高兴地欢迎在PHP的后续版本中有全序列化的特性。
使用类进行数据存储PHP和OOP一件非常好的事情就是,你可以很容易地定义一个类来操作某件事情,并且无论何时你想用的时候都可以调用相应的类。假设你有一个HTML表单,用户可以通过选择产品ID号来选择一个产品。在数据库中有产品的信息,你想把产品显示出来,显示它的价格等等。你拥有不同类型的产品,并且同一个动作可能对不同的产品具有不同的意思。例如,显示一个声音可能意味着播放它,但是对于其它种类的产品可能意味着显示一个存在数据库中的图片。你可以使用OOP或PHP来减少编码并提高质量:
定义一个产品的类,定义它应该有的方法(例如:显示),然后定义对每一种类型的产品的类,从产品类派后出来(SoundItem类,ViewableItem类,等等),覆盖在产品类中的方法,使它们按你的想法动作。
根据数据库中每一种产品的类型(type)字段给类命名,一个典型的产品表可能有(id,type,price,description,等等字段)...然后在处理脚本中,你可以从数据库中取出type值,然后实例化一个名为type的对象:
<span>1</span> <span>$obj</span>=<span>new</span><span>$type</span><span>(); </span><span>2</span> <span>$obj</span>->action();
这是PHP的一个非常好的特性,你可以不用考虑对象的类型,调用$obj的显示方法或其它的方法。使用这个技术,你不需要修改脚本去增加一个新类型的对象,只是增加一个处理它的类。
这个功能很强大,只要定义方法,而不去考虑所有对象的类型,在不同的类中按不同的方法实现它们,然后在主脚本中对任意对象使用它们,没有if...else,也不需要两个程序员,只有高兴。
你同意编程是容易的,维护是便宜的,可重用是真的吗?
如果你管理一组程序员,分配工作就是很简单的了,每个人可能负责一个类型的对象和处理它的类。
可以通过这个技术实现国际化,根据用户所选的语言字段应用相应的类就可以了,等等。
拷贝和克隆
当你创建一个$obj的对象时,你可以通过$obj2=$obj来拷贝对象,新的对象是$obj的一个拷贝(不是一个引用),所以它具有$obj在当时的状态。有时候,你不想这样,你只是想生成一个象obj类一样的一个新的对象,可以通过使用new语句来调用类的构造函数。在PHP中也可以通过序列化,和一个基类来实现,但所有的其它类都要从基类派生出来。
进入危险区域
当你序列化一个对象,你会得到某种格式的字符串,如果你感兴趣,你可以调究它,其中,字符串中有类的名字(太好了!),你可以把它取出来,象:
<span>1</span> <span>$herring</span>=<span>serialize</span>(<span>$obj</span><span>); </span><span>2</span> <span>$vec</span>=<span>explode</span>(':',<span>$herring</span>);<span>//</span><span>以:为标识符把字符串拆分成一个数组</span> <span>3</span> <span>$nam</span>=<span>str_replace</span>("\",'',<span>$vec</span>[2]);
所以假设你创建了一个"Universe"的类,并且强制所有的类都必须从universe扩展,你可以在universe 中定义一个clone的方法,如下:
<span> 1</span> <span>classUniverse{ </span><span> 2</span> <span> 3</span> <span>//</span><span>在新的PHP版本中克隆(__clone())是一个魔术方法,不要和这个方法搞混了</span> <span> 4</span> <span> 5</span> <span>functionclone(){ </span><span> 6</span> <span> 7</span> <span>$herring</span>=<span>serialize</span>(<span>$this</span><span>); </span><span> 8</span> <span> 9</span> <span>$vec</span>=<span>explode</span>(':',<span>$herring</span><span>); </span><span>10</span> <span>11</span> <span>$nam</span>=<span>str_replace</span>("\"",'',<span>$vec</span>[2<span>]); </span><span>12</span> <span>13</span> <span>$ret</span>=<span>new</span><span>$nam</span><span>; </span><span>14</span> <span>return</span><span>$ret</span><span>; </span><span>15</span> <span>16</span> <span>} </span><span>17</span> <span>18</span> }<span>//</span><span>然后</span> <span>19</span> <span>20</span> <span>$obj</span>=newSomething();<span>//</span><span>从Universe扩展</span> <span>21</span> <span>22</span> <span>$other</span>=<span>$obj</span>-><span>clone</span>();
你所得到的是一个新的Something类的对象,它同使用new方法,调用构造函数创建出的对象一样。我不知道这个对你是否有用,但是Universe类可以知道派生类的名字是一个好的经验。想象是唯一的限制。
模板引擎
Framework introductionthinkphp
ThinkPHP is a free and open source, fast and simple object-oriented lightweight PHP development framework. It was founded in early 2006 and released under the Apache2 open source agreement. It was born for agile WEB application development and simplified enterprise application development. ThinkPHP has been adhering to the simple and practical design principle since its birth. While maintaining excellent performance and minimal code, it also focuses on ease of use. It has many original functions and features. With the active participation of the community team, it has been continuously optimized and improved in terms of ease of use, scalability and performance. It has grown into the most leading and influential WEB application development framework in China, with many Typical cases ensure that it can be stably used for commercial and portal-level development.
PHP Certification Level
The PHP course consists of three parts: beginner (IFE), intermediate (IPE) and advanced (IAE).
PHP Security
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程序的语
记事本保存php文件注意事项
言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意这样以CGI方式安装它。内嵌的PHP可以具有更高的可伸缩性。
PHP免费安装
PHP源代码包安装版:这个版本适合已经有自己独立的网站域名、网站空间的专业网站建设用户。使用方法依然其为简单,只需三步:
第一、到官方网站:下载 PHP源代码包安装版最新版本,解压下载文件,将其中的全部内容上传到你的支持PHP的网站空间
第二、改更文件属性,请将根目录下以PHP为后缀名的文件和”/include/domain.php”和 “/attachments” 和 “/data”文件夹以及文件夹下所有的文件属性改成“可读”、“可写”、“可执行”,通常是“755”。
第三、打开你的网站根目录,系统会自动运行setup安装程序,按提示点下一步操作即可。
友情提示:当你下载我们的软件并看到这份说明时,则说明你一定是对企业网站建设有一定的需求或者你是一个网站建设技术学习者。
文件格式
1.对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 "?>"。这是为了防止多余的空格或者其它字符影响到代码。
例如:
$foo = 'foo';
2.缩进应该能够反映出代码的逻辑结果,尽量使用四个空格,禁止使用制表符TAB,因为这样能够保证有跨客户端编程器软件的灵活性。
例如:
<span>1</span> <span>if</span>(1==<span>$x</span><span>){ </span><span>2</span> <span>$indented_code</span>=1<span>; </span><span>3</span> <span>if</span>(1==<span>$new_line</span><span>){ </span><span>4</span> <span>$more_indented_code</span>=1<span>; </span><span>5</span> <span>} </span><span>6</span> }
3.变量赋值建议保持相等间距和排列。
例如:
<span>1</span> <span>$variable</span>='demo'<span>; </span><span>2</span> <span>$var</span>='demo2';
4.每行代码长度应控制在80个字符以内,最长不超过120个字符。因为 linux 读入文件一般以80列为单位,就是说如果一行代码超过80个字符,那么系统将为此付出额外操作指令。这个虽然看起来是小问题,但是对于追求完美的程序员来说也是值得注意并遵守的规范。
5.每行结尾不允许有多余的空格。
Php文件记事本编辑乱码问题
一般情况下,记事本编辑器在对文件进行完编辑并保存之时,其默认编码为ANSI,中文。然则更多的时候,php在语言环境设置时语言多数为utf-8,直接保存并用于apache等http-server解析后就会出现乱码。
为此,应该注意在用记事本编辑完后可将文件用“另存为”的方式对文件进行保存,并将“文件类型”选择“所有文件”,编码与文件指定语言编码一致即可。[4]
算数运算符
PHP 的运算符包括算术运算符、赋值运算符、比较运算符和逻辑运算符。[5]
算数运算符:
Add, subtract, multiply, divide, modulo (remainder)
, -, *, /, %
Assignment operator: (the following explanation varies in many books)
Assignment, addition assignment, subtraction assignment, multiplication assignment, division assignment, hyphen assignment
=, =, -=, *=, /=, .=
Bitwise operators:
Bitwise AND, bitwise OR, bitwise OR, bitwise NOT, left shift, right shift
&, |, ^, ~, 071af19a55f4da1989e8c02b755ba052>
Comparison operator:
Equal, all equal, not equal, not all equal, greater than, less than, greater than or equal, less than or equal
==, ===, != (a8093152e673feb7aba1828c43532094), !==, >, 95ec6993dc754240360e28e0de8de30a=, <=
Logical operators:
Logical AND, logical OR, logical NOT, logical OR
&&, ||, !, xor
String operators:
. Concatenate two strings