zoukankan      html  css  js  c++  java
  • PHP 类与对象 全解析( 一)

    目录

    PHP 类与对象 全解析( 一)

    PHP 类与对象 全解析( 二)

    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?
    2 
    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 . "
    ";  
                echo self::$my_static . "
    ";  
            }  
        }  
          
        OtherClass::doubleColon();  
        ?>   

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

  • 相关阅读:
    每天一个linux命令(20):linux chmod命令
    每天一个linux命令(19):Linux 目录结构
    每天一个linux命令(18):find 命令概览
    每天一个linux命令(17):locate 命令
    shiro实战系列(一)之入门实战
    nginx反向代理和tomcat集群(适用于ubutnu16.04及其centos7)
    Ubuntu16.04之开发环境构建
    Drools实战系列(三)之eclipse创建工程
    Drool实战系列(二)之eclipse安装drools插件
    谈谈maven多模块
  • 原文地址:https://www.cnblogs.com/easirm/p/4189251.html
Copyright © 2011-2022 走看看