php的类学习(一)

2013/10/02 2469点热度 0人点赞 0条评论
<?php
  function __autoload($class_name){
      //require_once语句在脚本执行期间包含并运行指定文件。此行为和 require()语句完全相同,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含
     require_once $class_name . '.php';
  }
  $obj =new testAAA();
  $obj2=new type();
?>

类的属性

  1)类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。

  2)属性声明是由关键字public或者protected或者 private开头,然后跟一个变量来组成

  3)属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶段运算出的常数。说明:为了兼容php4,php5声明属性依然可以直接使用关键字var,或者放在public,

  4)在类的成员方法里面,可以通过$this->property(property是属性名字)这种方式来访问类的属性、 方法.

  5)要访问类的静态属性或者在静态方法里面却不能使用访问属性的方法,而是使用self::$property

  6)在类的非静态方法里面可以使用伪变量$this,这个伪变量是调用该方法的实例化对象引用protected, or private之前。但是var并不是必须的。

<?php
   class SimpleClass{
      //错误的属性声明
    //  public $var1='hello'.' World';
    //  public $var2=<<<EO
//hello world
//EO;
//      public $var3=1+2;
 //     public $var4=self::myStaticMethod();
  //    public $var5=$myvar;
      //正确的属性声明
      public $var6=myConstant;
      public $var7=array(true,false);
      //在php5.3.0及其以后,下面的声明也正确
      public $var8=<<<'EOD'
      hello world
EOD;
   }
?>

类常量

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

<?php
class ConstantClass{
    const constant='常量值';
    function showConstant(){
       echo self::constant."<br>";
    }
}
    echo ConstantClass::constant."<br>";//相当于java中的ClassName.属性名
    $classname="ConstantClass";
   // echo $classname::constant,"<br>";//php5.3以后才有这种,相当于java中的ClassName.属性名,不过将ClassName动态化了,加上命名空间报错
    $class=new ConstantClass();
    $class->showConstant();
    echo $class::constant."<br>";//php5.3以后
?>

自动加载对象

  很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表。

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

 注意: autoload前面是两个下划线

1)在__autoload函数中抛出的异常不能陪catch语句块捕获,会导致致命错误

2)如果使用php的CLI交互模式时,Autoloading不存在

<?php
  function __autoload($class_name){
      //require_once语句在脚本执行期间包含并运行指定文件。此行为和 require()语句完全相同,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含
     require_once $class_name . '.php';
  }
  $obj =new testAAA();
  $obj2=new type();
?>

在testAAA.php文件中

<?php
class testAAA{
    function testAAA()
    {
        echo "加载了".get_class($this);
    }
}
?>

在type.php文件中

<?php
  class type{
      function type(){
          echo "加载了".get_class($this);
      }
  }
?>

构造函数

void __construct(...)

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

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

<?php
class BaseClass{
   function __construct(){
      //如果是子类调用该方法,get_class()返回的是子类的名称
      //echo get_class($this)."初始化了<br>";
      echo "BaseClass初始化了<br>";
   }
}
class SubClass extends BaseClass{
   function __construct(){
      parent::__construct();//默认不调用父类的构造函数,调用父类的构造函数方法
      echo get_class($this)."初始化了<br>";//有命名空间的情况下打印出来的:Base\SubClass初始化了,无:SubClass初始化了
   }
}
 $obj=new BaseClass();
 $obj=new SubClass();
  
class TreeClass{
   function TreeClass(){//当有__construct方法时,这个不执行的
      echo get_class($this)."初始化了<br>";
   }
 //  function __construct(){//没有命名空间的时候,两个不能同时出现
  //      echo "ac初始化了<br>";
  // }
}
$obj=new TreeClass();
class fourClass{
    function fourClass(){//定义了命名空间原始的
      echo get_class($this)."初始化了<br>";
   }
}
$obj=new fourClass();
?>

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

析构函数

void __destruct ( void )

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

<?php
class MyDestructClass{
   function __construct(){
      print "MyDestructClass初始化了<br>";
      $this->name="MyDestructClass";
   }
   function __destruct(){//全部解析完以后才执行该方法
     print "Destroying".$this->name."<br>";
   }
}
 $obj=new MyDestructClass();
?>

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

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

访问控制

  对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。

对类成员的访问控制

类成员都必须使用关键字public、protected 或 private 进行定义

注意:为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。

对方法的访问控制

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

对象继承

继承已为大家所熟知的一个程序设计特性,PHP 的对象模型也使用了继承。继承将会影响到类与类,对象与对象之间的关系。

比如,当扩展一个类,子类就会继承父类的所有公有和保护方法。但是子类的方法会覆盖父类的方法。

继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。

范围解析操作符(::)

范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。

 1)当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。

 2)self 和 parent这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。

 3)当一个子类覆盖其父类中的方法时,PHP 不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止。这种机制也作用于 构造函数和析构函数、重载 及 魔术 函数。

<?php
class MyClass
{
    const CONST_VALUE = '常量值';
 
    protected function myFunc() {
        echo "MyClass::myFunc()<br>";
    }
}
 
class OtherClass extends MyClass
{
    // 覆盖父类中的方法
    public function myFunc()
    {
        // 但仍然可以调用已被覆盖的方法
        parent::myFunc();
        echo "OtherClass::myFunc()<br>";
    }
    public static $my_Static="静态值";
    public static function doubleColon(){
       echo parent::CONST_VALUE."<br>";
    }
}
echo MyClass::CONST_VALUE,"<br>";
OtherClass::doubleColon();
$class = new OtherClass();
$class->myFunc();
?>

yxkong

这个人很懒,什么都没留下

文章评论