欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP 类与对象 全解析( 一)

程序员文章站 2022-04-15 20:52:24
1.类与对象   对象:实际存在该类事物中每个实物的个体。$a =new user(); 实例化后的$a 引用:php的别名,两个不同的变量名字指向相同的内容   封装: 把对象...
1.类与对象

 

对象:实际存在该类事物中每个实物的个体。$a =new user(); 实例化后的$a

引用:php的别名,两个不同的变量名字指向相同的内容

 

封装: 把对象的属性和方法组织在一个类(逻辑单元)里

继承:以原有的类为基础,创建一个新类,从而代码复用的目的;

多态:允许将子类类型的指针赋值给父类类型的指针。

-------------------------------------

 

2.自动加载对象:

自动加载通过定义特殊的__autoload函数,当引用没有在脚本中定义的类时会自动调用这个函数.

 

1 [php] view plaincopyprint?

2 function __autoload($class){  

3   require_once("classes/$class.class.php");  

4 }  

为什么要使用__autoload

 

1,首先是不知道这个类文件存放在什么地方,

2,另外一个就是不知道什么时候需要用到这个文件。

3,特别是项目文件特别多时,不可能每个文件都在开始的部分写很长一串的 require …

 

 

替代了一

require_once ("classes/books.class.php") ; 

require_once ("classes/employees.class.php" ) ; 

require_once ("classes/events.class.php") ; 

require_once ("classes/patrons.class.php") ;

 

zend推荐了一种最流行的办法,在文件名中包含路径。例如下面的例子:

 

 

 

 

1 [php] view plaincopyprint?

3     view sourceprint?  

4     // main.class    

5       

6     function __autoload($class_name) {     

7          $path = str_replace('_', directory_separator, $class_name);     

8          require_once $path.'.php';     

9      }    

 

 

 

temp = new main_super_class();

 

所有的下划线都会被替换成路径中的分隔符,上例中就会去 main/super/class.php文件。

 

缺点:

 

是在编码过程中,必须明确的知道代码文件应当所处的位置,

 

而且由于将文件路径硬编码在了类名中,如果需要修改文件夹的结构时,我们必须手工修改所有的类名。

 

如果是在一个开发环境中,并且对于速度不是很在意的话,使用'include all’这个方法是非常方便的。

通过将所有类文件放在一个或几个特定文件夹中,然后通过遍历的方式查找加载。

例如

 

 

    <?php     

      

    $arr = array (     

         'project/classes',     

        'project/classes/children',     

        'project/interfaces'    

     );    

      

     foreach($arr as $dir) {     

      

        $dir_list = opendir($dir);    

      

        while ($file = readdir($dir_list)) {     

             $path = $dir.directory_separator.$file;     

             if(in_array($file, array('.', '..')) || is_dir($path))     

                 continue;    

             if (strpos($file, ".class.php"))     

                 require_once $path;     

         }     

    }     

      

     ?>   

 

 

 

另外一个方法是在类文件和他的位置之间建立关联的配置文件,例如:

 

 

    view sourceprint?  

    // configuration.php     

      

    array_of_associations = array(     

        'mainsuperclass' = 'c:/main/super/class.php',     

        'mainpoorclass' = 'c:/blablabla/gy.php'    

     );   

 

 

 

调用的文件

 

 

    <?php     

        require 'autoload_generated.php';    

        function __autoload($classname) {     

           global $autoload_list;     

           require_once $autoload_list[$classname];     

        }    

          $x = new a();     

    ?>   

 

 

 

------------------------------------------------

 

 

3.构造函数和析构函数

 

 

php 构造方法 __construct() 允许在实例化一个类之前先执行构造方法。

 

构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct() 。

 

(在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,

所以通常用它执行一些有用的初始化任务。该方法无返回值。)

 

作用: 用来创建对象时初始化对象

子类执行分类的构造函数parent::__construct().

 

析构函数: __destruct ()定义:特殊的内成员函数,没有返回类型,没有参数,不能随意调用,也没有重载;

        只是在类对象生命结束的时候,由自动调用释放在构造函数中分配的资源。

 

  与构造方法对应的就是析构方法,析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。

  析构函数不能带有任何参数,其名称必须是 __destruct() 。 

作用:清理了善后工作,例如,在建立对象时使用new 开辟了一个内存空间,应在退出前使用析构函数释放在构造函数中分配的资源。

 

例子:

 

 

    class person {  

        public $name;  

        public $age;  

      

        //定义一个构造方法初始化赋值  

        public function __construct($name,$age) {  

            $this->name=$name;  

            $this->age=$age;  

        }  

        public function say() {  

            echo "my name is :".$this->name."<br />";  

            echo "my age is :".$this->age;  

        }  

        //析构函数  

        function __destruct()  

        {  

            echo "goodbye :".$this->name;  

        }  

    }  

      

    $p1=new person("ren", 25);  

    $p1->say();  

 

 

 

---------------------------------------------------------------

 

 

4 .访问控制

 

对属性或方法的访问控制,是通过在前面添加关键字 public、protected 或 private 来实现的

 public 所定义的类成员可以在任何地方被访问;

 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);

 private 定义的类成员则只能被其所在类访问。 

对类成员的访问控制

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

 

对方法的访问控制

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

 

例子:

 

 

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 

 

 

-------------------------------------------------------------

 

 

5 .对象继承

 

    继承定义:以原有的类为基础,创建一个新类,从而代码复用的目的;

--------------------------------------

覆写是对象继承时用到的

重载是单对象中同方法名不同参数的方法

--------------------------------------

 

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

 

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

 

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

 

 

    class person {  

        public $name;  

        public $age;  

      

        function say() {  

            echo "my name is:".$this->name."<br />";  

        echo "my age is:".$this->age;  

        }  

    }  

      

    // 类的继承  

    class student extends person {  

        var $school;    //学生所在学校的属性  

          

        function study() {  

            echo "my name is:".$this->name."<br />";  

            echo "my shool is:".$this->school;  

        }         

    }  

      

    $t1 = new student();  

    $t1->name = "zhangsan";  

    $t1->school = "beijindaxue";  

    $t1->study();  

 

 

 

-------  ---------  ------   ---------  --------   -----

 

 

6 .范围解析操作符(::)

 

 

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

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

 

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

注意:

当一个子类覆盖其父类中的方法时,php 不会再执行父类中已被覆盖的方法,直到子类中调用这些方法为止

 

 

例子:

 

 

    <?php  

    class otherclass extends myclass  

    {  

        public static $my_static = 'static var';  

      

        public static function doublecolon() {  

            echo parent::const_value . "\n";  

            echo self::$my_static . "\n";  

        }  

    }  

      

    otherclass::doublecolon();  

    ?>