public,private,protected(属性与方法关键字)
public的权限最大,可以让本类、子类使用,也可以支持实例化之后的调用。
protected表示的是受保护的,访问的权限是只有在子类和本类中才可以被访问到,不支持实例化调用。
private 表示的是私有,只能够是在当前的类中可以被访问到,不可以在子类中访问,不支持实例化调用。
<?php
//
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
public function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
protected function pro_test(){
var_dump(1);
}
}
$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
//echo $obj->protected; // 这行会产生一个致命错误
//echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
$obj->pro_test();//直接报错
?>
interface(接口关键字),abstract(抽象类与抽象方法关键字)
接口(interface)的特点 :
1、接口的方法必须是公开的。
2、接口的方法默认是抽象的(无方法体),所以不在方法名前面加abstract。
3、接口可以定义常量,但不能定义成员属性,常量的定义和用法和类中常量一样。
4、类可以实现多个接口,通过implements实现(当一个类实现了接口,必须实现接口所有方法)。
5、接口也可以继承接口,通过extends来实现。
interface的意义在于规范编程的风格,设想一下就是如果是实现了一个接口那么我们在使用这个接口类的时候就必须要实现里面的方法,起到了统一命名的作用。
<?php
interface testA{
function funcA();
}
interface testB{
function funcB();
}
interface testC extends testA {
function funcC();
}
class run implements testC ,testB {
public function funcA()
{
// TODO: Implement funcA() method.
}
public function funcB()
{
// TODO: Implement funcB() method.
}
public function funcC()
{
// TODO: Implement funcC() method.
}
}
?>
abstract修饰的类(抽象类)中,可以有一个或者是多个的abstract修饰方法(抽象方法),所以我们可以这样理解,interface就是abstract的一种特殊情况(当所有的方法都是抽象方法,都是必须要实现的)。abstract有以下的这些特征:
1. 只要类中有至少一个方法使用了abstract关键字,那么这个类是abstract,要加上相应的关键字。
2. 抽象方法,只有方法的声明部分,没有方法体。
3.一个类继承抽象类需要实现所有抽象方法,除非自己为抽象类。
但是在我看来,abstract在实际的应用中有这样的几种场景
1. 多人编程的时候规范公共部分的命名规则(不做任何说明,原理跟interface一样)
2. 实现不让父级直接实例化使用
<?php
abstract class shopping
{
public function buy()
{
echo "buy";
}
abstract public function getValue();
public function loan()
{
echo "loan";
}
}
class leslieBuy extends shopping
{
}
//$test1=new shopping;//直接语法错误
$leslieSie = new leslieBuy;
$leslieSie->loan();//打印出loan
?>
注意:接口和抽象类是不能实例化的,只能继承和实现
final(类与方法关键字)
final只能够用来修饰class与function,使用了final之后就不能够被继承。
例如如下的代码就会直接报错:
class BaseClass {
public $public = 'Public';
function test() {
echo "BaseClass::test() called\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
static(属性与方法关键字)
在PHP中,使用关键字 static 修饰成员属性和成员方法被称为静态属性和静态方法。静态属性和静态方法不需要在类被实例化的情况下可以直接使用。
静态属性
与普通的成员属性不同,静态属性属于类本身而不属于类的任何实例。静态属性可以被看做是存储在类当中的全局变量,可以在任何地方通过类来访问它们。
由于静态属性不受任何具体对象的限制,所以不需要建立类实例,而可以直接引用类中的静态属性,使用语法格式如下:
类名称::$静态属性名称
其中,符号”::”被称作范围解析操作符,它可以用于访问静态成员、静态方法和常量,还可以用于覆盖类中的成员和方法。
如果想在同一类的成员方法中访问静态属性,可以通过在该静态属性的名称前加上操作符”self::”来实现。例子如下:
class DaBing{
static $bing=0; //定义静态属性 bing
function addOne(){
self::$bing++; //调用同一类中的静态属性 bing
echo"\$bing的值为:".self::$bing++;
}
}
$obj=new DaBing();
$obj->addOne();
静态方法
在PHP中将成员方法声明为静态,就称其为静态方法。由于静态方法不受任何具体对象的限制,所以不需要建立类实例就可以直接引用类中的方法。语法格式如下:
类名称::静态方法名称([参数1,参数2,……])
与调用静态属性相同,在类中使用操作符”self::”来表示调用同一类中的静态方法,例子如下:
class DaBing{
static function addOne($number){ //定义静态方法 addOne()
echo"\$number+1=";
echo $number+1;
}
static function showResult($number){
echo"\$number=".$number;
echo"<br>";
self::addOne($number); //调用同一类中的静态方法 addOne()
}
}
$number=100;
DaBing::showResult($number);