@一个类的案例:
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 方法名(); } 使用 class 类 extends 抽象类{ //实现我们的抽象方法 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"作为参数传入