PHP高级 面向对象1 第30天

2012-11-15 16:41:31 0  category: 第二阶段php


基本概念



每个类的定义都以关键字 class 开头,后面跟着类名,可以是任何非   PHP 保留字的名字。后面跟着一对花括号,里面包含有类成员和方法的定义。伪变量   $this 可以在当一个方法在对象内部调用时使用。$this是一个到调用对象(通常是方法所属于的对象,但也可以是另一个对象,如果该方法是从第二个对象内静态调用的话)的引用。看下面例子:


<?php 
class A
{
function foo()
{
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this is not defined.\n";
}
}
}

class B
{
function bar()
{
A::foo();
}
}

$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
/*输出:
$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined.


*/
?>



简单的类定义

<?php 
class SimpleClass
{
// 成员声明
public $var = '这是一个默认值';

// 方法声明
public function displayVar() {
echo $this->var;
}
}
?>



类成员的默认值

<?php 
class SimpleClass
{
// 无效的类成员定义:
public $var1 = 'hello '.'world';
public $var2 = <<<EOD
hello world
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;

// 正确的类成员定义:
public $var6 = myConstant;
public $var7 = self::classConstant;
public $var8 = array(true, false);


}
?>


new

要创建一个对象的实例,必须创建一个新对象并将其赋给一个变量。当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。

<?php 
$instance = new SimpleClass();
?>



当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。

<?php 
$assigned = $instance;
$reference =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
/*输出:
NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned will have this value"
}
*/
?>



extends

一个类可以在声明中用 extends   关键字继承另一个类的方法和成员。不能扩展多个类,只能继承一个基类。  

  被继承的方法和成员可以通过用同样的名字重新声明被覆盖,除非父类定义方法时使用了   final 关键字。可以通过   parent::来访问被覆盖的方法或成员。


<?php 
class ExtendClass extends SimpleClass
{
// Redefine the parent method
function displayVar()
{
echo "Extending class\n";
parent::displayVar();
}
}

$extended = new ExtendClass();
$extended->displayVar();
?>



属性



类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。   属性声明是由关键字public或者protected或者   private开头,然后跟一个变量来组成。   属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶段运算出的常数。


Note:

为了兼容php4,php5声明属性依然可以直接使用关键字var,或者放在public, protected,    or private之前。但是var并不是必须的。在php 5.0 到5.1.3,var会认为是废弃的,    而且抛出E_STRICT警告,但是5.1.3之后就不再认为是废弃,也不会抛出警告。  

   如果直接使用var声明属性,而没有public, protected,    或 private,php 5 会认为这个属性为public


在类的成员方法里面,可以通过$this->property(property是属性名字)这种方式来访问类的属性、   方法,但是要访问类的静态属性或者在静态方法里面却不能使用,而是使用self::$property。   更多Static关键字,请查看Static 关键字。  

  在类的非静态方法里面可以使用伪变量$this,这个伪变量是调用该方法的实例化对象引用(一般来说该对象是这个方法所在类的实例化对象,   但是也有可能是另外的类的对象,比如在另一个类里面使用静态化来调用这个类的方法 )。


属性声明

<?php 
class SimpleClass
{
// 错误的属性声明
public $var1 = 'hello ' . 'world';
public $var2 = <<<EOD
hello world
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;

// 正确的属性声明
public $var6 = myConstant;
public $var7 = array(true, false);

//在php 5.3.0 及之后,下面的声明也正确
public $var8 = <<<'EOD'
hello world
EOD;
}
?>



跟heredocs不同,    nowdocs能够使用在静态变量,也能使用在静态声明


使用nowdoc初始化属性

<?php 
class foo {
// As of PHP 5.3.0
public $bar = <<<'EOT'
bar
EOT;
}
?>


Note:

在php 5.3.0 增加了Nowdoc的支持。




类常量



我们可以在类中定义常量。常量的值将始终保持不变。在定义和使用常量的时候不需要使用$符号。  

  常量的值必须是一个定值,不能是变量,类属性或其它操作(如函数调用)的结果。



PHP5.3.0之后,我们可以用一个变量来动态调用类。但该变量的值不能为关键字self,   parentstatic



定义和使用一个类常量


<?php 
class MyClass
{
const constant = 'constant value';

function showConstant() {
echo self::constant . "\n";
}
}

echo MyClass::constant . "\n";

$classname = "MyClass";
echo $classname::constant . "\n"; // PHP 5.3.0之后

$class = new MyClass();
$class->showConstant();

echo $class::constant."\n"; // PHP 5.3.0之后
?>

静态数据示例

<?php 
class foo {
// PHP 5.3.0之后
const bar = <<<'EOT'
bar
EOT;
}
?>


自动加载对象


PHP 5 中,不再需要这样了。可以定义一个  __autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在  PHP 出错失败前有了最后一个机会加载所需的类。

Note:  

在 __autoload 函数中抛出的异常不能被   catch语句块捕获并导致致命错误。

Autoload 例子

<?php 
function __autoload($class_name) {
require_once $class_name . '.php';
}

$obj = new MyClass1();
$obj2 = new MyClass2();

//本例尝试分别从 MyClass1.php和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类。

?>


构造函数和析构函数


构造函数

void __construct     ([ mixed $args    [, $...   ]] )

  PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。  

Note:    如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用    parent::__construct()。  



使用新标准的构造函数


<?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();
?>



为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct()函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为   __construct() 的方法,但它却又不是构造函数。  

   与其它方法不同,当__construct()被    与父类__construct()具有不同参数的方法    覆盖时,PHP不会产生一个E_STRICT错误信息。  

   自PHP 5.3.3起, 在命名空间中,与类名同名的方法不再作为构造函数。 这一改变不影响    不在命名空间中的类。


<?php 
namespace Foo;
class Bar {
public function Bar() {
// treated as constructor in PHP 5.3.0-5.3.2
// treated as regular method as of PHP 5.3.3
}
}
?>


析构函数

void __destruct     ( void    )

  PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如   C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。


析构函数示例


<?php 
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}

function __destruct() {
print "Destroying " . $this->name . "\n";
}
}

$obj = new MyDestructableClass();
?>


和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用   parent::__destruct()。  

   析构函数即使在使用exit()终止脚本运行时也会被调用。在析构函数中    调用exit()将会中止其余关闭操作的运行。  

Note:    

析构函数在脚本关闭时调用,此时所有的HTTP头信息已经发出。            脚本关闭时的工作目录有可能和在SAPI(如apache)中时不一样。  

Note:    

试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。





面向对象1


概念:

对象

成员属性

成员属性说白了就是变量和常量

成员方法

就是函数,并且可以传参。



类:就是一系列单个个体的抽象

对象:就是由某个类产生的具体的个体。



对象与类之间的关系,就是配置单与具体的实物之间的关系。由配置单产生实体。


名字命名:

1, 只用字母,数字,下划线,不要用特殊字符

2, 类名不区分大小写,但是最好严格按照命名规范来进行

3, 不能以数字开始

4, 命名要有意义

5, 类名别重名



注意:

->  就为汉语中的



new 一个对象的时候,后面写上类名,类名后面带不带括号均可,但是在未来,学了构造方法,如果构造方法中,需要形参,就必须要加括号。



$this,代表第一人称代词。自己,我。



魔术方法:


1, 但是在php5当中,你实例化一个对象调用的构造方法名,采用__construct();



何谓实例对象呢?

就是  $p1  =  new    Person;

对象的其它叫法: 对象实例。