php抽象类可以重写接口的常量吗,PHP类,抽象类,接口,魔术常量和魔术方法学习笔记!...

oop面向对象编程的特点:封装、继承、多态!

[修饰符] class 类名 [extends 父类] [implements 接口1[,接口2...]]{

【成员属性】定义变量

【成员方法】定义函数

}

魔术常量和魔术方法

//php单继承,多层继承

//类在未实例化时,只存在静态方法和静态属性。

//call_user_func_array('回调函数名',array('函数传递的参数'));

//echo new cat instanceof cat ? "yes":"no";//判断一个对象是否是某个类的实例

//echo is_a(new cat,'cat') ? "yy":"nn";//判断一个对象是否是某个类的实例

//echo is_subclass_of('b','a')?"是":"否";//如果此对象是该类的子类,则返回 TRUE

//echo get_class(new cat);//返回对象的类名

//echo get_parent_class('b');//返回对象或类的父类名

//echo get_parent_class(new b); //返回对象或类的父类名

//method_exists();

//function_exists();

//file_exists();

//trigger_error('错误', E_USER_ERROR);

class cat{

const A = 'HELLO,WORLD!testabc';//常量,值一经定义不可修改,子类可以覆盖父类常量

var $var = 'hello';

public $name;

protected $age; //protected 外部调用要用到__get魔术方法

private $money; //private 外部调用要用到__get魔术方法

public static $num1;//调用示例:$cat = new cat; $cat::$num; // cat::$num;

protected static $numb;//外部不可直接调用

private static $number;//外部不可直接调用

//属性和方法调用本类和父类用 $this

//静态属性和静态方法调用本类和父类用 self 和 parent ,或者类名

public function __construct($name='admin',$age=18,$money=1000000){

echo "

构造函数,自动调用!

";

$i = func_num_args();//参数个数

$a = func_get_args();//参数数组

$this->name = $name;

$this->age = $age;

$this->money = $money;

self::$num += 10;

//echo cat::A;//调用常量

// echo self::A; //调用常量

//echo static::A; //调用常量

}

//php的8个魔术常量

public function index(){

echo"

文件中的当前行号:".__LINE__."

";

echo"

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名:".__FILE__."

";

echo"

文件所在的目录。dirname(__FILE__)如果用在被包括文件中,则返回被包括的文件所在的目录:".__DIR__."

";

echo"

小写的函数名称:".__FUNCTION__."

";

echo"

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字:".__CLASS__."

";

echo"

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar):".__TRAIT__."

";

echo"

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写):".__METHOD__."

";

echo"

当前命名空间的名称(区分大小写):".__NAMESPACE__."

";

}

/**********************属性相关魔术方法start*************************************/

//验证一个对象属性isset($this->name) 或 empty($this->name)时,

//$this->name 是一个非公有属性时,自动调用此方法。

//$cat = new cat;$cat->__isset($cat->name);

//$cat = new cat;isset($cat->name);

public function __isset($name){

return isset($this->$name);

}

//当销毁一个对象属性unset($this->name), $this->name是一个非公有属性时,自动调用此方法。

//$cat = new cat;$cat->__unset($cat->name);var_dump($cat->name);

//$cat = new cat;unset($cat->name);var_dump($cat->name);

public function __unset($name){

unset($this->$name);

}

//类外部直接设置一个对象中的非公有属性时会自动调用的方法

//$cat = new cat;$cat->name = 'abc';

//$cat = new cat;$cat->__set('name','abc');

public function __set($name,$value){

return $this->$name=$value;

}

//非公有属性会自动调用的方法,并将属性名作为参数传进去。

//$cat = new cat; echo $cat->name ;

//$cat = new cat; echo $cat->__get('name');

public function __get($name){

if(isset($this->$name)) {

return $this->$name;

}

return null;

}

//自己封装方法获取私有或受保护的属性

//内部调用示例:$this->get('属性名');

//外部调用示例:$cat = new cat; $cat->get('属性名');

public function get($name){

if(isset($this->$name)) {

return $this->$name;

}

return null;

}

/**********************属性相关魔术方法end*************************************/

/**********************方法相关魔术方法start*************************************/

//当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用

//$cat = new cat;$cat->test(1,2,3,4);

//$cat = new cat;$cat->__call('test',array(1,2,3,4));

public function __call($funcName,$args){

echo "方法".$funcName."不存在!
";

echo "

";print_r($args);//数组值为传递的所有参数

}

//当调用一个不可访问静态方法(如未定义,或者不可见)时,__callStatic() 会被调用。

//cat::test(1,2,3,4);

//$cat = new cat;$cat->__callStatic('test',array(1,2,3,4));

public static function __callStatic($funcName,$args){

echo "静态方法".$funcName."不存在!
";

echo "

";print_r($args);//数组值为传递的所有参数

}

public function __clone(){

echo "对象 clone 克隆,自动调用!";exit();

}

public function __wakeup(){

return "在执行反串行化unserialize时自动调用的方法,目的是实现资源属性的打开(sleep方法关闭的资源)";

}

//执行串行化serialize时自动调用的方法,目的是实现资源类型的属性的关闭操作。

//return array();

public function __sleep(){

return array();

}

public function __set_state($array){

echo "当调用var_export()时,这个静态 方法会被调用"; exit();

}

public function __debugInfo(){

return array();

}

//__invoke把对象当成函数使用的时候自动调用

//$cat = new cat; echo $cat();

public function __invoke() {

return "__invoke";

}

final public function finalfunction(){

return "final 关键字只能用于修饰类和方法,修饰类则子类不能继承,修饰方法则不能被子类重写!";

}

//__toString()方法:魔术方法,当我们直接要输出一个对象时,如echo $a,print $a,

public function __toString(){

return '这是一个对象,不允许對對象進行ehco,print...';

}

public function __destruct(){

echo "

析构函数,自动调用!

";

}

}

抽象类和接口

//抽象类abstract 不能实例化,只能修饰类和非私有方法,不能修饰属性

//可以有普通方法和属性,不需要子级实现,不能覆盖抽象方法,可以继承抽象类的同时添加抽象方法,

//包含了抽象方法的类必须是抽象类,继承了抽象类的"普通类"必须实现抽象类的"所有抽象方法"

//继承了抽象类的"普通类"必须实现抽象类的"所有抽象方法"

//常量区分大小写,继承抽象类的子类 可以重写 抽象类的常量

abstract class a{

const AA ='aa';

public $name;

protected $age;

private $wife;

abstract public function func0() ;

abstract protected function func1() ;

private static function func2(){}

}

class b extends a{

public $a;

public function func0(){}

protected function func1(){}

private function func3(){}

}

//接口使用关键字interface来定义,接口中只能有常量与抽象方法。同抽象类相同,是更具体的抽象类

//假如一个抽象类中所有的方法都是抽象的,那么我们可以使用另外一种方式定义:接口

//接口不能有普通属性和普通方法,abstract只修饰类不修饰方法

//实现接口关键字 implements 可以一次实现多个接口,实现的类里常量不能重写 接口定义的常量

//一次实现多个接口时,这些接口里的常量和接口方法不能重复。

interface cc{

const B ='bb';

function inter();

function cc();

}

interface dd{

const A ='dd';

function dd();

}

class c implements cc,dd{

public function cc(){}

public function dd(){}

public function inter(){}

}

//*自动加载"类函数"__autoload(类名): 当new 实例化一个对象时,这个类若不存在,则自动调用此函数,并将类名存入参数

function __autoload($className) {

include_once $className.'.php';

}

spl_autoload_register( function($class_name){

require_once $class_name . '.php';

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值