@一个类的案例:

class Person{
    //声明常量
    const constant 'constant value';
    //2 attributes     var $attribute1;  //$attribute1就是一个属性,我们可以利用 $this->attribute1来获取或设置其值。     var $attribute2;
    //public,private以及protected。和C#的作用一样。但是需要注意的是,PHP默认的是public,而不是大多数语言默认的private 
    public $attribute1;
    public static $test=1;
    
//2 functions     function Operation1()     {     }     function Operation2($param1,$param2)     {     }
    
    //静态成员(属性或方法)均属于类,故不能通过$this或->访问。
    static function SquredSize($length)
    
{
      return $length*$length;
    }
    echo Shape::SquredSize(10);
    
    //construction function
       function __construct($param)
       {
            $this->attribute1=$param;
       }


    //destruction function
    function __destruct()
    
{
      $this->attribute1=0;
    }   }
  
//在定义和使用常量的时候不需要使用 $ 符号。
  echo Person::constant

 

  ***普通类的继承***
  class Father{
    public function __construct(){
      echo '我是父类的构造方法!';
    }
    protected function say($str = 'Hello World!'){
        echo '说了一句话:' . $str;
    }
  }
  class chirld extends Father{
    public __construct(){
      echo '我是子类的构造方法~';
    }
  }
  //此时你实例化子类,结果将会是我是子类的构造方法~! 当然,因为继承关系,所以子类是可以调用父类的say()方法的。  
  //如果你想实现父类的构造方法,然而你又想实现子类的构造方法,你可以这样子去做
  class chirld extends Father{
    public __construct(){
      parent::__construct();
      echo '我是子类的构造方法~';
    }
  }
  //这时候就会输出我是父类的构造方法!我是子类的构造方法~

  **方法重写,php没有方法重载****  
  

   假设你在子类中定义了这么一个方法:


1     protected function say($str = ''){
2         echo '我是子类的say';
3     }

    那么,你此时从父类继承下来的sys()方法将会被重写,所以调用后输出的结果就是:我是子类的say


    如果你这样定义会怎样?


1     public function say($str = ''){
2         echo '我是子类的方法哦~';
3     }

    这样的写法还是可以的。PHP跟其他强类型语言不同的地方是,PHP重写方法允许你对重写的方法”向上公有化”,而不允许你”向下私有化”,就比如在这里你定义为private是肯定会报错的,而像C++这样语言确恰恰相反

    PHP的对于这种情况的思想就是,你父亲给了你受保护级别的遗产,此时在你手上是保护级别的,你父亲允许你对对别人分享,也就是public,但不允许你自己藏起来,也就是private,自己独吞肯定不行的

    此时你肯定会问,那么父类的say()设置为private会怎样? 
    结果不会怎样,就是父类已经私有化了,子类根本继承不到,所以你在子类中的say()方法随你这么定都可以。

    还有一个问题,就是父类已经定义了sys()中带可选参数,那么,在子类中的你像下面这样无参数定义会怎样呢?

    public function say(){
        echo '哈哈。我没有参数了耶~';
    }

    结果还是可以正常运行的,只不过会有 E_STRICT级的提示。原因在于PHP标准就是参数的数量必须跟父类对齐,当然,可以在php.ini中进行错误级别设置。

  



  ***接口***   声明   
interface 接口名{     //方法是不能有实现     function 方法名();   }   实现接口   class 类名 implements 接口1,接口2{     //必须要实现接口中定义的方法,否则会报错   }   ***抽象类***   声明   abstract class 类名{   //抽象类当中也可以包含有实现的方法     function 方法名(){       //     }     //抽象方法不能有实现,一个抽象类中必须要有一个抽象方法     abstract function 方法名();   }   使用   classextends 抽象类{     //实现我们的抽象方法     function 方法名(){     }   }

 

 

@类的说明:

(1),类声明与对象实例化

  php声明变量时不需要任何关键字修饰,而在类中声明成员属性时,变量前面一定要使用一个关键字,例如public,private,static等关键字来修饰,但这些关键字修饰的变量都具有一定的意义。如果不需要有特定意义的修饰,就使用var关键字,一旦成员属性有其他的关键字修饰就需要去掉var。

(2),类的构造方法和析构方法

  (1),构造方法是对象创建完成后第一个被对象自动调用的方法,这是我们在对象中使用构造方法的原因(完成一些对象的初始化工作)

  function __construct(){}  //函数可以带参数,注意:前面是2个下划线

  (2),析构方法是对象在销毁之前最后一个被对象自动调用的方法,这也是我们在对象中使用析构方法的原因(完成一些对象在销毁前的清理工作)

  function __destruct(){}  //不常用,析构函数不能带任何参数,注意:前面是2个下划线

(3),PHP 的类的类型检查
  你要想判断一个类是不是某个类的类型。非常简单,就是instanceof,如果你使用过java,那么你非常熟悉了,因为和Java一样。如果你是用C#的,类似于C# 里的is。

(4)魔术方法

  ***所谓魔术方法,就是系统在特定时刻自动调用的方法!各魔术方法有一个共同点:系统自动调用,有两个不同点:调用的时间、调用之后产生的作用
  __toString 当将对象直接输出时,会调用此魔术方法,此方法返回一个字符串
  __call 当调用的方法不存在时
  __callStatic 当调用的静态方法不存在时
  __get 当访问不存在的属性
  __set 当给不存在的属性赋值时

(5)自动加载类__autoloda()

  php中,如果一个页面需要使用多个类,就不得不在脚本页面开头编写一个长长的包含文件的(include)列表,这样处理不仅繁琐,而且容易出错。

  php提供了类的自动加载功能,这可以节省编程的时间。当你尝试使用一个php没有组织到的类时,它会寻找一个__autoload()的全局函数(不是在类中声明的函数)。如果存在这个函数,php会用一个参数来调用它,参数即类的名称(需要使用类的名称)。

  ---自动加载使用到的类名文件(根据类名找相应名称的文件,故需类名与类文件名一致)

  案例代码如下:

  <?php

    //声明一个自动加载类的魔术方法__autoload()

    //@param string $className 需要加载的类名称字符串

    function __autoload($className){

      //在方法中使用include包含类所在的文件

      include(strtolower($className).".class.php");

    }

    $obj = new User(); //user类不存在,则自动调用 __autoload()函数,将类名"User"作为参数传入

    $obj2 = new Shop(); //Shop类不存在,则自动调用 __autoload()函数,将类名"Shop"作为参数传入

posted on 2016-12-27 21:14  学到老死  阅读(148)  评论(0)    收藏  举报