|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
终于学会把表单的数据插入数据库,然后显示出来了,应该说一个程序的雏形已经诞生了。php5|对象 摘要]今朝开辟中的PHP5,其面向对象的性能已被大幅度的强化了。下一代的PHP将会是如何的一种言语呢?上面咱们来具体解说一下今朝宣布的PHP5的beta release。
(一) Zend 2.0的出生
如今的PHP4所利用的根基文法是被称之为Zend 引擎的剧本编译引擎。这个就是PHP4的优秀性能的缘由之一,是作为对PHP3的改善而生成的一种言语。人人一向以为,PHP4的功能依据现在的方针,比PHP3有了很大的提拔,在收集编程的世界里占有了很大的份额。
开辟了Zend 引擎的Zend公司是在开辟PHP4的同时,由PHP3的次要开辟者Zeev Suraski和Andi Gutmans所创建的企业兼并而来的。Zend的称号是由Zeev和Andi的名字合起来构成的。Zend公司的贸易形式是,延续不休的为open source供应zend 引擎的PHP内核 (core),同时提拔周边产物开辟和销售的好处。以open source software作为基盘的贸易,活着界局限内大多半正在苦战的企业中,算是对照好的典范例子了。
■PHP4的局限
托PHP4胜利的福,这个用处的合用局限逐步变广起来。作为企业级的用处而利用PHP的说法时有所闻。因而,就有了如许一个成绩,修建大范围网站的时分,代码的再使用性非常差。详细来讲就是,PHP4的面向对象功能很弱,因而习气于利用Java等的手艺人员对此有良多的埋怨。
慢慢的改良PHP4的面向对象的功能,大幅度的更改根基文法,开辟者告竣了更新PHP记叙办法的开辟目标。
■Zend 2.0入手下手开辟
随后,Zend公司PHP中间的开辟者们在2001年7月宣布了作为下一代PHP言语引擎的Zend 2.0引擎的构思。以[Zend Engine version 2.0: Feature Overview and Design]
(http://www.zend.com/engine2/ZendEngine-2.0.pdf)作为方针的同时,面向对象的功能大幅度的强化了。
今朝的PHP4 Zend 引擎的扩大情形与往日的PHP3千篇一律。这就意味着,要提拔新的言语引擎的主版本号,明白办法方针,迎接来自开辟整体的夸奖。
Ze2的开辟,与以往的Zend引擎一样,都是运转在open source的形式下的。最新的源代码在CVS上被周全的公然,由于是面向开放的开辟者的,关于开辟的群情十分的活泼。
如今Ze2被决意采取于PHP的下一个版本PHP5中。终究宣布的工夫如今还不决,然而假设依据Zend公司2003年4月1日宣布的Newsletter的话,如今的应当就是Beta Release了。
(二) PHP5的新特征
接上去请依照按次看一下被强化的PHP5的功能。起首是最为主要的面向对象功能,类的实体特征在大幅度的被修正着。这里说的仅是关于类的新特征。
・ 对象的参照过渡是默许的(default)
・ 引入会见属性的限制
・ 引入会见办法的限制
・ 笼统类和笼统办法
・ 接口
・ final声明
・ 名空间
・ 类内常量
・ 类变量
・ 一致构建器
・ 析构函数(Distructor)
・ 其他从属特征
以上内容是依据2003年4月22日CVS上登录版本材料所写的,在正式的宣布之前,也有变化的能够性。
■对象的默许参照过渡
在PHP4中,在以变量$var1为类的实体对象的时分,假如$var2 = $var1;那末,在$var2中,$var1的复制被代入。分明的,$var2为了指向与$var1不异的对象,就要写成$var2 =& $var1,必需要加上&作为参照。
而在PHP5,对象的代入将成为主动的参照过渡。也就是说,
$var2=$var1,二者指向不异的对象。假如想要同php4一样,带入copy,那末就会应用到导入__clone()的办法。
$var2 = $var1->__clone();此处,clone后面是两个一连的“_”
(这仅仅是类的实体的特征)
■引入会见属性的限制
在PHP4的类中,连同属性和办法在内,可以自在的会见类的表里任何中央,而没无限制。因而,用户就没法提防属性的有意中的更改。
而在PHP5中,同C++和Java一样,导入了private, protected, public三个品级的会见限制,使得类的设计者可以对属性和办法的利用办法停止限制。以下是各类会见限制的意思。
・ Public: 可以自在的在类的表里任何中央停止参照、变动
・ Private: 只能在这个类的办法中停止参照、变动
・ Protected:可以在这个类和承继了这个类的另外一个类的办法中停止参照、变动。别的,在承继的类中,可以写入会见指定。
在PHP4中的“var”,同以往一样与public有着不异的意思。上面就来举一个例子,让咱们来看看会见限制是如何起感化的。
PHP代码:--------------------------------------------------------------------------------
class Hoge1 {
private $var1 = 'A';
protected $var2 = 'B';
protected $var3 = 'C';
function setLower() {
$this->var1 = 'a';
$this->var2 = 'b';
$this->var3 = 'c';
}
function var1() {
return $this->var1;
}
function var2() {
return $this->var2;
}
function var3() {
return $this->var3;
}
}
--------------------------------------------------------------------------------
在这个类中,带有$var1, $var2, $var3三个属性。$var1被声明为private, $var2和$var3是protected.在此处
PHP代码:--------------------------------------------------------------------------------
$hoge=new Hoge1;
echo’var1:’.$hoge->var1.”
n”
--------------------------------------------------------------------------------
假如测验考试参照不答应从内部停止会见的private属性,那末就会呈现以下毛病:
Fatal error: Cannot access private property hoge1::$var1 in /path/to/script.php on line XX
关于protected的$var2也是不异的。
然而,由于$hoge的办法是没有private和protected的,所以上面的代码可以正常运作,前往外部公有和回护变量的值。
PHP代码:--------------------------------------------------------------------------------
echo 'var1: ' . $hoge->var1() . "
\n"; // var1: A
echo 'var2: ' . $hoge->var2() . "
\n"; // var2: B
echo 'var3: ' . $hoge->var3() . "
\n"; // var3: C
$hoge->setLower();
echo 'var1: ' . $hoge->var1() . "
\n"; // var1: a
echo 'var2: ' . $hoge->var2() . "
\n"; // var2: b
echo 'var3: ' . $hoge->var3() . "
\n"; // var3: c
--------------------------------------------------------------------------------
其次,为了可以看到protected的属性的形态,咱们试着发明了承继了Hoge1的类Hoge2
PHP代码:--------------------------------------------------------------------------------
class Hoge2 extends Hoge1 {
public $var3 = '3';
function d_var1() {
return $this->var1;
}
function d_var2() {
return $this->var2;
}
function d_var3() {
return $this->var3;
}
}
--------------------------------------------------------------------------------
在类Hoge2中,只要$var3被声明为public。在属性是protected的情形下,从子类停止会见有何种限制,是由子类的属性声明决意的。在Hoge2中,由于$var3被声明是public,因而不管是从何处都可以会见Hoge2的$var3(实体是Hoge1的$var3)。由于$var1在Hoge1中是private,因而,在Hoge2子类中Hoge1的$var1不会被承继,而在Hoge2中有能够会做知名为$var1的属性,因而,必需要明白辨别Hoge1::$var1和Hoge2::$var1。
PHP代码:--------------------------------------------------------------------------------
$hoge = new Hoge2;
echo 'var1: ' . $hoge->var1 . "
\n"; // var1:
// echo 'var2: ' . $hoge->var2 . "
\n"; // Error
echo 'var3: ' . $hoge->var3 . "
\n"; // var3: 3
echo 'var1: ' . $hoge->d_var1() . "
\n"; // var1:
echo 'var2: ' . $hoge->d_var2() . "
\n"; // var2: B
echo 'var3: ' . $hoge->d_var3() . "
\n"; // var3: 3
--------------------------------------------------------------------------------
$hoge->var1是与Hoge1::var1没有关系的变量,因而不会有任何显示,由于var2有protected会见限制,所以假如欠亨过method就直接参照$var2,就会呈现致命毛病。
■引入会见办法的限制
与上述不异,此处也分为private, protected, public三种。
・ Public: 可以从任何中央挪用
・ Private: 只可以从这个类的method内挪用
・ Protected: 只可以从这个类和subclass的method中挪用
此处的意思同Java和C++不异,请不要弄混。
■笼统(abstract)的类和笼统的办法
撑持与Java不异的笼统类和笼统办法。笼统办法只供应了办法名的挪用体例,而没有供应实体。别的,持有笼统办法的类,必需笼统宣言类自己。假如想要直接作成笼统类的对象,那末就会呈现以下的致命毛病。
Fatal error: Cannot instantiate abstract class ClassName
发生毛病的实践的例子以下所示:
PHP代码:--------------------------------------------------------------------------------
abstract class MyAbstract {
abstract public function test();
public function test2() {
echo "MyAbstract::test2() called.
\n";
}
}
class MyImplement extends MyAbstract {
public function test() {
echo "MyImplement::test() called.
\n";
}
}
$obj = new MyImplement;
$obj->test();
?>
--------------------------------------------------------------------------------
■接口(interface)
撑持与Java不异的接口(interface)。接口是合适所描写的内部挪用模式而设计组合起来的。
接口的实体不克不及够纪录。相反的,完成接口的类必需持有与这个接口的办法绝对应的实体。别的,类可以完成多个接口,因而,有能够完成多重承继。
PHP代码:--------------------------------------------------------------------------------
interface Throwable {
public function getMessage();
}
interface Serializable {
public function toString();
}
class MyException implements Throwable, Serializable {
public function getMessage() {
return 'this is MyException message';
}
public function toString() {
return 'MyException: this is MyException message';
}
}
$e = new MyException;
echo $e->getMessage();
echo $e->toString();
?>
--------------------------------------------------------------------------------
■final声明
同Java一样,PHP5撑持final声明。假如关于一个办法追加final声明,这个办法将一定在子类不克不及重载(Override)。假如办法被final声了然,然而还在子类中重载,就会呈现以下毛病:
PHP代码:--------------------------------------------------------------------------------
Fatal error: Cannot override final method fuga::foo()
--------------------------------------------------------------------------------
发生毛病的例子:
PHP代码:--------------------------------------------------------------------------------
class Fuga {
final function foo() {
echo "this is final function\n";
}
}
class Hoge extends Fuga {
function foo() {
echo "this is not final function\n";
}
}
?>
--------------------------------------------------------------------------------
(三) PHP5的新特征(续)
PHP5的宣布企图
在后面的文章中咱们提到,“依据ZEND公司2003年4月1日宣布的讯息的话,如今的应当就是Beta Release了”,然而开辟者外部会商的了局是,Beta为时髦早,并且有能够不是Beta Release.
对这方面意向有乐趣的可以参照 news://news.php.net/ 上所发布的信息 php.version5.dev:372
在这个文件中,PHP5的宣布企图又从头回到了一张白纸,而另外一方面,Zend Engine2的开辟正在着手停止中。PHP5的Release其实大体就是企望着“快点到年关吧”。
PHP5的新特征
接着咱们来看一下在后面所讲到的其他一些关于类的新增的性能
■名空间
PHP5撑持名空间。因而,咱们可以在名空间内装入类、变量、常量、函数。
在PHP4的Scope中,只要global、函数内、类内这三个品种,所以要出格注重假如不注重的话,将会很轻易“净化”global空间。假设利用名空间的话咱们就可以够在package里分别变量定名空间,因而应当就可以对照轻易的做成自力的package。
利用实例以下:
PHP代码:--------------------------------------------------------------------------------
namespace This {
class Hoge {
}
const aConstant = 'This Constant';
function aFunction() {}
var $aVariable = 'This Variable';
}
$obj = new This::Hoge;
echo This::aConstant . "
\n";
This::aFunction();
echo This::$aVariable . "
\n";
--------------------------------------------------------------------------------
假定要会见名空间内的对象的话,就应当如许做:
名空间名::对象名
然而PHP5的名空间不会套入与C++相异的模样。
■Class内常量
利用关头字const,可以在类、名空间内界说常量。这里由于是常量,因而必定要在常量名的后面加上$。Class内的常量,比这个类中的global常量的优先级要高。
在这里const是预定语,因而在class名和函数名中利用const的时分要做需要的修改。
PHP代码:--------------------------------------------------------------------------------
define('constant_value', 'global constant');
class MyClass {
const constant_value = 'class constant';
function printConstant() {
print constant_value;
}
}
echo MyClass::constant_value . "
\n";
MyClass:rintConstant();
?>
--------------------------------------------------------------------------------
在这个例子里,MyClass:rintConstant()是显示常量constant_value的值,然而,constant_value存在于global空间和Class内这两个中央。在这类情形下,MyClass内的常量constant_value的优先级较高,被显示为「class constant」。
■对象变量
即便是在类没有被实例化形态下,对象变量也能正确的依照指定的值被初始化。会见的办法以下:
类名::$变量名
PHP代码:--------------------------------------------------------------------------------
class Hoge {
static $my_static = 5;
}
print Hoge::$my_static;
?>
--------------------------------------------------------------------------------
■一致构建器
在生成对象的时分,可以主动被挪用的办法被称作“构建器”。
PHP4中的构建器,是与Class名不异的办法名。这是与Java和C++不异的中央,因而,关于一些用惯了的人来讲,不会有别扭感。然而,假如要从子类中挪用父类的构建器的话,在PHP中就必需特地写上父类的名字。
在PHP中,父类的构建器不克不及被主动挪用,因而,情形就对照多。
在PHP5中,一致采取了__constructor这个构建器称号,不论class名是甚么,但凡被称为__construct()的,都被看成构建器来处置。
别的,思索到同PHP4的交换性,假设存在于Class名不异的之前的构建器名,那末,优先利用谁人构建器。
PHP代码:--------------------------------------------------------------------------------
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
$obj = new SubClass();
?>
--------------------------------------------------------------------------------
■析构函数
与构建器相反,可以在对象释放时主动被挪用的办法被称为析构函数。
PHP4撑持析构函数,经由过程登录在PHP运转终止时用register_shutdown_function()挪用的函数,只要相似的实施办法。PHP5正式撑持析构函数,可以在类中指定对象释放时的举措。
析构函数就是名为__destruct的办法。当对象外部的参照计数器酿成0的时分,__destruct()被挪用,然后对象所利用的内存被释放出来。
PHP代码:--------------------------------------------------------------------------------
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = 'MyDestructableClass';
}
function __destruct() {
print 'Destroying ' . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
--------------------------------------------------------------------------------
别的,与构建器不异的中央是,父类的析构函数不克不及被主动的挪用,需要的时分,需求用号令:
parent::__destruct();
■会见
在PHP4中,假如会见了一个不存在的属性,那末体系就会主动生成与之绝对应的新属性。
PHP代码:--------------------------------------------------------------------------------
class Hoge {
}
$obj = new Hoge;
$obj->prop = "This is new property";
--------------------------------------------------------------------------------
如上所示,当把值代入一个不存在的属性时,谁人代入点就会主动生成一个新属性。一样的,会见一个不存在的属性,就好像被代入NULL值的变量一样,不会产生毛病。
在PHP5中追加了一点,就是可以对会见恣意的属性停止掌握。在类中假如存在__set()、__get()如许的办法,替换上述的举措此处的办法将可以被挪用。例如:
PHP代码:--------------------------------------------------------------------------------
class Hoge {
function __set($name, $value) {
print "__set() is called with ($name, $value)\n";
$this->$name = $value;
}
}
$obj = new Hoge;
$obj->a = '123';
$obj->a = '456';
$obj->b = '789';
?>
--------------------------------------------------------------------------------
在这里,__set 办法被作为不决义属性的代入办法,在显示值以后将值代入不决义属性。
PHP代码:--------------------------------------------------------------------------------
$obj->a = '123';
--------------------------------------------------------------------------------
履行这一句时,由于在这个时分不存在属性a,因而,作为取代,__set 办法被挪用。
__set() is called with (a, 123)
其次,
$obj->a = '456';
再一次的代入$obj->a,这一次,因为属性a已存在,所以__set 没有被挪用,和凡是一样把值代入到了属性a中去了。
$obj->b = '789';
这一回,咱们把值代入另外一个属性b中,同a的第一次情形一样,
__set() is called with (b, 789)
同__set 办法相反,__get 办法是在对不存在的属性的援用时挪用的。将这二者联合起来,再来看一下关于属性的会见,实践上,使用它可以写出在分歧的场所都能做出分歧呼应的类来。
PHP代码:--------------------------------------------------------------------------------
class Hoge {
public $properties;
function __set($name, $value) {
$this->properties[$name] = $value;
}
function __get($name) {
return $this->properties[$name];
}
}
$obj = new Hoge;
$obj->a = '123';
$obj->b = '456';
echo $obj->a;
echo $obj->b;
print_r($obj);
?>
--------------------------------------------------------------------------------
在这个例子里,对类中一切属性的会见被装入了$properties中,如许,使咱们到场的属性不直接的附在对象之下。这是个不太能轻易了解的例子,例如,试着把这个例子中的保留到$properties改成存入文件或是数据库会很风趣吧。实践上,在对象外面,咱们可以复杂的完成让很多的庞杂的操作。
与__set, __get几何有些分歧,然而__call也能用来书写不存在的办法,当咱们向以下例子一样挪用对象的办法的时分,
$object->methodname();
假如这个类中不存在methodname这个办法,凡是情形下,就会呈现以下毛病:
Fatal error: Call to undefined method Class::methodname()
然而,假如这个类中存在__call这个办法,作为替换,__call就被挪用。__call的参数有两个,第一个参数是被叫出的办法名,第二个参数是坚持了的被挪用的参数的数组。思索到有良多的利用办法,除以下的例子外,还可使用其它的办法。
PHP代码:--------------------------------------------------------------------------------
class Proxy {
private $object;
function __call($name, $params) {
if (isset($this->object)) {
if (method_exists($this->object, $name)) {
return call_user_func_array(array($this->object, $name), $params);
}
else {
return "method not exists.";
}
}
}
function __construct($object) {
$this->object = $object;
}
}
class Hoge {
function add($var1, $var2) {
return $var1 + $var2;
}
}
$p = new Proxy(new Hoge);
$result = $p->add(1, 2);
echo "result: $result
\n";
$result = $p->sub(5, 3);
echo "result: $result
\n";
?>
然后大吼:别人可以,我为什么就不可以?(是不是有点阎罗教练的味道,默默的确是电影看多了,抽嘴巴是会痛的,各位其实明白这个道理了就行了) |
|