目录Table Of Contents
类表示要在应用程序中处理的实际事物。例如要创建一个管理图书的应用程序,类就是用来表示书,员工,顾客等,每个实体都包含一组性质和行为,在oop中分别称为属性property和方法method
< ?phpclass Employee{ private $name; //属性 private $title; protected $wage; protected function clockIn() { //方法 echo "Member $this->$name clocked in at ".date("h:i:s"); } protected function clockOut() { echo "Member $this->$name clocked out at ".date("h:i:s"); }}?>
类提供了一个基础,可以在此基础上创建实体的特定实例,称为对象object,例如一个employee类可以创建员工a和b
< ?php$employee = new Employee();?>
< ?phpclass Employee{ private $name; //声明属性的有private,public,protected private $title; protected $wage;}?>
调用属性使用->操作符
< ?phpclass aa{ public $name = 'a'; function test() { $this->name = $name; //this表示引用当前类 }}?>
属性作用域有五种,public,private,protected,final,static
* public是默认的,声明公共作用域中的属性,公共属性可以由相应的对象直接访问和操作,但在oop不鼓励使用公共属性,避免被其他人访问和修改属性。
* private只能在定义属性中的类中被访问,并且不能由其子类使用,因为oop主要原则:封装,私有属性必须通过公共接口或者方法来访问
< ?phpclass aa{ private $name; public function setName($name) { //通过了公共方法来设置私有属性 $this->name = $name; }}$b = new aa;$b->setName("Mary");?>
将属性的操作封装在一个方法中,可以让开发人员可以严密地控制如何设置属性。
属性重载是通过重载__set和__get方法来实现访问和修改属性的时候自动触发修改。
__set
< ?phpclass Employee{ var $name; function __set($propName,$propValue){//__set方法有参数属性名和值,所以这里有2个变量 echo $propName."\n"; }}$employee = new Employee();$employee->name = "Mario"; //当触发修改属性的时候,就会触发__set方法,因为这里属性只有name而没有title,所以$employee->title = "hello";?>-----title //__set执行成功的话会返回true,失败就返回false,并且会执行函数内的代码,所以这里因为没有title属性,所以失败了,并且输出了失败的title属性。
__get
类似__set
因为__set__get的关系,只能处理简单的属性,对于复杂的oop应用程序来说还是不足够的,所以需要实现自己的方法,考虑为每个私有属性创建两个方法:
< ?php class Employee{ private $name; public function getName(){ return $this->name; } public function setName($name){ $this->name = $name; } }?>
方法与函数非常相似,只不过方法用来定义类的行为。
php支持6种方法作用域:public,protected,private,abstract,final,static
public,protected,private,final,static跟变量的作用域很相似
抽象方法,只在父类声明,但在子类实现,如果想定义一个应用编程接口API,以后将它作为实现的一个模型,就可以声明一个抽象方法
< ?phpabstract class Employee{ abstract function hire(); abstract function fire();}?>
常量constant,用来表示不会改变的值,在对象的整个生命周期中都保持不变。
< ?phpclass mathFunctions{ const PI = '3.1415926';}echo mathFuctions::PI; ?>
构造函数是在实例初始化的时候自动执行的函数,可以接受参数,可以调用类和方法,可以调用其他构造函数。
< ?php class Book{ private $title; private $isbn; private $copies; function __construct($isbn) { //这个就是构造函数 $this->setIsbn($isbn); //这里自动读取参数,设置书编码 $this->getTitle(); //自动获取书title $this->getNumberCopies(); //自动获取有多少本相同的书 } public function setIsbn($isbn) { $this->isbn = $isbn; //将参数赋值到类的属性isbn } public function getTitle() { $this->title = "hello,im a title!"; print ("Title: {$this->title}"."\n"); } public function getNumberCopies() { $this->copies = "5"; print ("Number copies available: {$this->copies}"."\n"); } } $book = new Book("061452424");?>----Title: hello,im a title! //直接实例就能够有输出,自动的。Number copies available: 5
每当实例化新对象时都会调用的方法,最好都通过构造函数完成,此外要确保这些方法只能在构造函数中被调用,需要设置private
需要使用parent显式调用
< ?php class Employee{ protected $name; protected $title; function __construct() { echo "Employee constructor called!"."\n"; } } class Manager extends Employee{ function __construct() { parent::__construct(); //实例Manager对象就能够执行了Employee对象的构造函数 echo "Manager constructor call!"."\n"; } } $employee = new Manager();?>----Employee constructor called!Manager constructor call!
例如:classname::__constructor();
析构就是构造的反义,撤销对象的在内存的数据
< ?php class Employee{ protected $name; protected $title; function __construct() { echo "Employee constructor called!"."\n"; } function __destruct() { echo "Its destroyed!"."\n"; } } $employee = new Employee();?>----Employee constructor called!Its destroyed! //脚本执行结束就会撤销内存中的对象。
当需要创建供所有类实例共享的属性和方法的时候,这些属性和方法与所有类实例有关,但不能由任何特定对象调用,例如编写一个类来跟踪网页访问者的数量,正常来的说,每次实例化类的时候都会将计数清零,所以需要设置static,静态类。
< ?phpclass Visitor{ private static $visitor = 0; //设置了静态属性 function __construct() { self::$visitor++; //静态属性和方法需要使用self来引用 } static function getVistors() { //设置了静态方法,其实这里不用static也可以,静态方法是可以不用实例化而直接调用的,这里因为构造函数实例化了,所以用不用static function都可以 return self::$visitor; }}$visits = new Visitor();echo $visits::getVistors()."\n"; //静态方法需要使用::来调用$visits2 = new Visitor();echo $visits2::getVistors()."\n";?>----1 //计数没有终止,而是继续累计。2
本文由 PeterYuan 创作,采用 署名-非商业性使用 2.5 中国大陆 进行许可。 转载、引用前需联系作者,并署名作者且注明文章出处。神一样的少年 » 第二章(面向对象oop)《php和mysql web开发》《php与mysql程序设计》齐读