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';
});