仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1838|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网页设计为面向对象而生的PHP5

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
#
发表于 2015-2-4 00:30:07 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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";
?>

  然后大吼:别人可以,我为什么就不可以?(是不是有点阎罗教练的味道,默默的确是电影看多了,抽嘴巴是会痛的,各位其实明白这个道理了就行了)
山那边是海 该用户已被删除
18#
发表于 2015-7-11 18:39:21 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
只想知道 该用户已被删除
17#
发表于 2015-5-11 22:07:57 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
因胸联盟 该用户已被删除
16#
发表于 2015-5-11 04:15:18 | 只看该作者
爱上php,他也会爱上你。
兰色精灵 该用户已被删除
15#
发表于 2015-5-6 18:53:51 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
再现理想 该用户已被删除
14#
发表于 2015-4-27 04:27:38 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
老尸 该用户已被删除
13#
发表于 2015-4-26 14:09:43 | 只看该作者
爱上php,他也会爱上你。
乐观 该用户已被删除
12#
发表于 2015-4-20 12:39:45 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
简单生活 该用户已被删除
11#
发表于 2015-4-11 09:15:12 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
谁可相欹 该用户已被删除
10#
发表于 2015-4-10 23:39:38 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
蒙在股里 该用户已被删除
9#
发表于 2015-4-6 19:45:14 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
小妖女 该用户已被删除
8#
发表于 2015-4-4 17:15:15 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
透明 该用户已被删除
7#
发表于 2015-3-12 16:22:47 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
变相怪杰 该用户已被删除
6#
发表于 2015-3-12 11:52:52 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
金色的骷髅 该用户已被删除
5#
发表于 2015-3-11 16:21:49 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
深爱那片海 该用户已被删除
地板
 楼主| 发表于 2015-3-6 15:03:42 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
莫相离 该用户已被删除
板凳
发表于 2015-2-19 15:34:48 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-2-7 01:57:49 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
分手快乐 该用户已被删除
楼主
发表于 2015-2-4 13:14:52 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 21:12

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表