PHP5权威编程阅读学习笔记 附电子书下载_php教程-查字典教程网
PHP5权威编程阅读学习笔记 附电子书下载
PHP5权威编程阅读学习笔记 附电子书下载
发布时间:2016-12-29 来源:查字典编辑
摘要:PHP5权威编程(PHP5PowerProgramming)PDF下载地址http://www.jb51.net/books/28207.h...

PHP 5 权威编程(PHP 5 Power Programming) PDF下载地址 http://www.jb51.net/books/28207.html

PHP4中,不使用__construct()作为构造函数的名字,必须使用类的名字定义一个方法,就像在C++中一样。

PHP5中,使用新的统一的构造函数命名方式:__construct(),当然,使用类名同样也是可以的。

但是,你如果两个同时使用的话,系统默认会使用__construct()的形式。

复制代码 代码如下:

<?php

class Person{

//PHP4中的方法

public function Person(){

echo "PHP4中的方法";

}

//PHP5推荐使用的方法

public function __construct(){

echo "PHP5推荐使用的方法";

}

public function say(){

}

}

$p1=new Person();

?>

在构造函数中不能返回值,所以从构造函数内产生一个错误最常用的做法就是抛出一个异常。

代码如下:

复制代码 代码如下:

<?php

class Person{

private $_age;

public function __construct($age){

try {

if ($age<120){

$this->_age=$age;

}else {

throw new Exception("您输入的年龄过大");

}

}catch (Exception $e){

echo $e->getMessage();

}

}

}

$p1=new Person(121);

?>

访问控制

对象属性的访问保护是OOP的一个关键范例

Public:可以在任何地方被访问

Protected:类成员可以被其所在类的子类和父类从对象内部的方法访问

Private:类成员只能被其所在类从对象内部的方法访问,而无法从继承类的成员中访问到。因为私用成员不会被继承,所以两个相关的类完全可以分别声明一个名字相同的私有变量。

也就是两个类都只能看到自己的私有属性,私有成员之间是没有关系的。

例子:

复制代码 代码如下:

<?php

/**

* Define MyClass

*/

class MyClass

{

public $public = 'Public';

protected $protected = 'Protected';

private $private = 'Private';

function printHello()

{

echo $this->public;

echo $this->protected;

echo $this->private;

}

}

$obj = new MyClass();

echo $obj->public; // 这行能被正常执行

echo $obj->protected; // 这行会产生一个致命错误

echo $obj->private; // 这行也会产生一个致命错误

$obj->printHello(); // 输出 Public、Protected 和 Private

/**

* Define MyClass2

*/

class MyClass2 extends MyClass

{

// 可以对 public 和 protected 进行重定义,但 private 而不能

protected $protected = 'Protected2';

function printHello()

{

echo $this->public;

echo $this->protected;

echo $this->private;

}

}

$obj2 = new MyClass2();

echo $obj->public; // 这行能被正常执行

echo $obj2->private; // 未定义 private

echo $obj2->protected; // 这行会产生一个致命错误

$obj2->printHello(); // 输出 Public、Protected2,但不会输出 Private

注意:类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。

静态方法

静态方法可以不创建对象实例就通过 类名::静态方法 来调用,也可以在一个对象实例中通过$this->静态方法或self::静态方法来调用。

复制代码 代码如下:

<?php

class Foo

{

public static $my_static = 'foo';

public static function staticValue() {

return self::$my_static;//在类中访问静态成员使用self关键字

}

}

$obj=new Foo();

echo $obj->staticValue();//方式一

echo Foo::staticValue();//方式二

?>

克隆对象

在PHP4中,new一个对象的时候,返回的是“对象本身”

在PHP5中,new一个对象的时候,返回的是“指向对象的句柄”

这意味着在PHP5中,将对象实例($obj1)赋值给另一个变量($obj2)的时候,两个对象都是指向同一块内存区域。

比如 :

复制代码 代码如下:

<?php

class test{

public $str;

}

$obj1=new test();

$obj1->str="obj1";

$obj2= $obj1;

$obj2->str="obj2";

echo $obj1->str;//将输出“obj1”

?>

由于$obj1和$obj2指向的是同一块内存区域,因此使用任何一个对象修改其中的成员变量的值的时候,都会影响到另一个对象。

但是在有些时候,我们确实需要复制一个对象的拷贝(两块相互独立的内存区域),这时候可以使用语言命令clone

参考下面的例子;

复制代码 代码如下:

<?php

class test{

public $str;

}

$obj1=new test();

$obj1->str="obj1";

$obj2= clone $obj1;

$obj2->str="obj2";

echo $obj1->str;//将输出“obj2”

?>

parent::和self::

self::指向当前类,而且通常用来访问静态成员,方法和常量

parent::指向父类,而且它经常被用来调用父类的构造函数和方法,也可以用来访问父类的成员和常量

注意:你应该使用parent::而不是父类的某个具体的名字,因为这样可以令你方便的更改你的类的层次。

例子:

复制代码 代码如下:

<?php

class Father{

public function __construct(){

echo "调用父类的构造函数<br>";

}

}

class Son extends Father {

public function __construct(){

parent::__construct();//方式一

// Father::__construct();//方式二

echo "调用子类的构造函数";

}

}

$son=new Son();

?>

结果:

调用父类的构造函数

调用子类的构造函数

推荐使用方式一,原因上面已经说了。

instanceof实例

复制代码 代码如下:

<?php

class Rectangle {

public $name=__CLASS__;

}

class Square extends Rectangle {

public $name=__CLASS__;

}

class Circle{

public $name=__CLASS__;

}

function checkIfRectangle($shape){

if ($shape instanceof Rectangle ){

echo $shape->name;

}else {

echo "该对象不是Rectangle类的实例";

}

}

checkIfRectangle(new Square());//输出:Square

checkIfRectangle(new Circle());//输出:该对象不是Rectangle类的实例

?>

注:__CLASS__是一个特殊的常量,用来存储当前类的名字

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新php教程学习
    热门php教程学习
    编程开发子分类