实例
<?php namespace User; //一个正常类,可以被实例化,可以继承 class User{ // 公共属性 public $name; public $salary; // 受保护的属性 protected $sex; // 私有化 private $work; // 静态属性,静态可以public也可以protected public static $age; public static $height; /* *先定义一个静态属性——连接对象 *这里定义个静态属性,并且还把的值定义为null,就是方便后面好赋值,好调用 */ protected static $pdo = null; // 类常量 const CATEGORY = "这是一个类常量"; // 构造方法 /* 1、定义一个构造方法(初始化方法,一个类也就一个构造方法) 2、构造方法不能是私有的,受保护的,只能是公共的public */ public function __construct($name,$salary){ $this->name = $name; $this->salary = $salary;//当前类对象的常规属性 self::$age = 30;//读取当前类的静态属性 echo self::$age; } //定义一个静态方法work public static function work($name,$height){ /* *首先静态方法里面不能用这个$this,因为静态方法是属于类成员,不是对象 *静态方法里面只能用self 不然就会出现这个错误:Fatal error: Using $this when not in object context in H:\phpstudy_pro\WWW\html.io\1008\class_a.php on line 24 */ //return $this->name;//这样写会出现上面的错误 self::$height = $height; return self::$height; } public function info($content){ echo "这是常规类方法".$content; } //定义4个魔术重载方法 // 当读取User类里面不可访问属性的值时,__get()被自动触发; public function __get($name){ if($name ==='boss'){ return ($this->name ==='admin') ? $this->$name : '权限不够'; } return $this->$name; } // 当设置User类里面不可访问属性的值时,__set()被自动触发 public function __set($name,$value){ if($name ==='boss'){ return ($this->name ==='admin') ? $this->$name : '权限不够'; } return $this->$name; } //当对User类里面不可访问属性进行isset() 或empty()判断时,__isset()被自动触发 public function __isset($name){ return isset($this->$name); } public function __unset($name){ unset($this->$name); } // public function __call($name,$arguments){ echo $name."方法不存在,触发了__call()方法"; } public static function __callStatic($name,$arguments){ echo $name."静态方法不存在,触发了__callStatic()方法"; } } // 常规类操作---先实例化 $user = new User('xiaomao',20); echo "<br>"; echo "常规方法--->"; // 获取对象的方法 $user->info('这是内容'); echo "<br>"; // 获取类的静态属性 echo "静态属性--->".User::$age; echo "<br>"; echo "静态方法--->".User::work('name','333303'); // 用abstract定义一个抽象类,不能直接被实例化,可以继承 abstract class Phone{ // 定义一个受保护属性 protected $name; // 定义一个构造方法 public function __construct($name){ $this->name = $name; } // 定义一个获取器,把当前的名字返回过期 public function getName(){ return $this->name; } // 定义一个抽象方法---设置名字(签名) abstract public function setName($value); } class MyPhone extends Phone{ // 先写个构造方法,构造方法不能继承 public function __construct($name){ parent::__construct($name); } // 还必须先实现所继承抽象类中的抽象方法 public function setName($value){ $this->name = $value; } } // 操作MyPhone类 $phone = new MyPhone('xiaomao'); echo "<br>用户名--->".$phone->getName()."<br>"; $phone->setName('Kat'); echo "他的昵称是--->".$phone->getName()."<br>"; //假如直接实例化Phone类,$newPhone = new Phone();报错--- // Fatal error(致命错误): Uncaught Error(未定义错误): Cannot(不能) instantiate(实例化) abstract(抽象) class(类) User\Phone(User空间里面的Phone类) // // 定义一个接口类 interface qqLogin{ //定义方法,必须要实现的 public function setName($name); public function setPass($password); } //实现接口 class Mylogin implements qqLogin{ //定义两个属性 public $name; public $password; //先实现接口中的方法 public function setName($name){ $this->name = $name; } //继续实现接口中的方法 public function setPass($password){ $this->password = $password; } //可以弄一个自己的方法 public function login(){ return "你的登录账户:".$this->name."<br>你的登录密码为:".$this->password; } } //继续实现接口 class Myreg implements qqLogin{ //还是要定义两个属性 public $name; public $pass; //继续实现接口中的方法 public function setName($name){ $this->name = $name; } public function setPass($password){ $this->pass = $password; } public function reg(){ return "你的注册账户:".$this->name."<br>你的注册密码为:".$this->pass; } } //开始调用类Mylogin $login = new Mylogin(); $login->setName('李大仙'); $login->setPass('123456'); echo $login->login(); //开始调用类Myreg $reg = new Myreg(); $reg->setName('黄四娘'); $reg->setPass('654321'); echo "<br>"; echo $reg->reg(); ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
总结:接口类一般都是别人类,不然哪会那么多条件!