摘要:方法如无的调用,则默认为为静态方法。声明静态方法会有错误提示,但很方便,能用尽量用效率高。
一、面向对象的关键字
1.instanceof操作符:
对象是否属于类(检测继承性),如下:
class Person {}; class Student extends Person {}; $p=new Person; $s=new Student; echo $p instanceof Student;//false echo $s instanceof Student;//true echo $s instanceof Person;//true
2.final关键字:
不定义常量,不能使用final修饰成员属性
a.final可以修饰类,该类不能扩展(不能有子类),即最终类,如下:
final class Person {......};
b.final可以修饰方法,这个方法不能在子类中被覆盖(不能被扩展),即最终方法,如下:
public final function say(){......}; //子类不能用parent::say();调用
3.static关键字:
a.将一个类中多个实例对象的共用属性/方法存入初始化静态段中,节省内存空间 b.类第一次出现,加载时,已将static成员加载到了内存,即不创建实例对象,也可以访问该成员//echo Person::country c.静态成员一定要使用类来访问//echo Person::country d.静态成员可以访问也可以赋值,赋值后所有实例都变化,self关键字可以在本类中代表本类名,类似this e.静态成员一旦被加载,只有脚本结束才释放 f.该关键字可以修饰属性和方法,不能修饰类。方法如无$this的调用,则默认为为静态方法。声明静态方法会有错误提示,但很方便,能用尽量用(效率高)。 g.上述第f条的缺点如下: (1)占内存,脚本结束才释放 (2)静态方法只能使用静态属性,因为不能使用$this
4.const关键字
a.常量存储区域为初始化静态段 b.define只能在类外部声明常量,内部报错 c.const只能修饰成员属性,即定义常量,注意: (1)常量使用大写,不能使用$ (2)声明时必有初值 (3)访问方式与static相同(self::name),但只能读
二、魔术方法
1.自动调用,只有PHP语言存在 2.以“__”开始 3.方法名固定 4.如果不写就不存在,也没有默认功能
1.__toString():将对象转为自定义的字符串(类似js),该方法不能有参数,必须返回一个字符串(echo/print后常用),如下:
class Person { function __toString(){ return "$$$$
"; } }; $p=new Person; echo $p;//$$$$
2.__clone():
a.克隆对象
class Person { function __toString(){ return "$$$$
"; } }; $p=new Person; $p2=clone $p;
b.魔术方法:
(1)在克隆对象时自动调用 (2)作用:与构造方法一样,对新克隆的对象初始化 (3)该方法中$this代表副本,可进行初始化($that有时可代表原本,有的版本能用)
class Person { var $name; function __construct($name){ $this->name=$name; } function say(){ echo $this->name."
"; } function __clone(){ $this->name="ni"; } }; $p=new Person("wo"); $p->say();//wo $p2=clone $p; $p2->say();//ni
3.__call():
a.调用对象中不存在的方法时,自动调用
b.有两个参数,第一个参数不存在的方法名,第二个是不存在方法的参数数组
c.作用:将功能相似方法进行批量处理或对不存在方法完成提示功能
class Person { var $name; function __construct($name){ $this->name=$name; } function say(){ echo $this->name."
"; } function __clone(){ $this->name="ni"; } function __call($method,$args){ echo "方法{$method}(),参数为"; print_r($args); echo"不存在!
"; } }; $p=new Person("wo"); $p->eat("肉","米"); //方法eat(),参数为Array ( [0] => 肉 [1] => 米 ) 不存在!
d.可以用来实现重载(与JS函数的arguments方法类似)
class Foo1{ public function __call($name,$arguments){ if($name=="doStuff"){ /** *实际上,不仅仅可以第一个参数类型,还可以判断参数个数,以及参数顺序,那么就和C++等强数据类型语言的重载效果是一样的了! */ if(is_int($arguments[0])){ $this->doStuffForInt($arguments[0]); }else if(is_string($arguments[0])){ $this->doStuffForString($arguments[0]); } } } private function doStuffForInt($a){ echo "执行的是doStuffForInt()方法"; } private function doStuffForString($a){ echo "执行的是doStuffForString()方法"; } } $foo1=new Foo1; $foo1->doStuff("1");//执行的是doStuffForString()方法
三、单态/单件/单例设计模式
概念:一个类只能创建一个对象,最适合PHP使用的设计模式
方法:
a.先将构造函数私有化,让类不能创建对象,如下:
class Person { private function __construct(){ } function __destruct(){ echo "######
"; } function say(){ echo "$$$$
"; } }; $p=new Person;//报错
b.定义(static)静态方法,在类中创建类的对象,外部使用类调用来创建对象,但这样仍然是每次调用创建一个新对象,而不是只能创建一个对象,具体如下:
class Person { private function __construct(){ } static function createObj(){ $obj=new self; return $obj; } function __destruct(){ echo "######
"; } function say(){ echo "$$$$
"; } }; $p=Person::createObj();//###### $p=Person::createObj();//###### $p=Person::createObj();//###### $p=Person::createObj();//###### $p->say();//$$$$
c.将新建对象的变量$obj设定为静态属性(唯一的),即可达到要求,该类只能创建一个对象,如下:
class Person { static $obj=null; private function __construct(){ } static function createObj(){ if(is_null(self::$obj)){ self::$obj=new self; } return self::$obj; } function __destruct(){ echo "######
"; } function say(){ echo "$$$$
"; } }; $p=Person::createObj(); $p=Person::createObj(); $p=Person::createObj(); $p=Person::createObj(); //由于只创建了一个类,只输出一次###### $p->say();//$$$$
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/25594.html
摘要:初始化我们知道容器初始化后会对容器中非懒加载的,单例的以及非抽象的定义进行的初始化操作,所以我们分析源码的入口也就是在容器初始化的入口,分析容器初始化后在什么地方开始第一次的初始化。 前言 Spring IOC容器在初始化之后会对容器中非懒加载的,单例的以及非抽象的bean定义进行bean的初始化操作,同时会也涉及到Bean的后置处理器以及DI(依赖注入)等行为。对于Bean的初始化,...
摘要:一面向对象的概念什么是面向对象世间万物皆对象,抽象的也是对象,一切可见或不可见都是对象对象的基本组成对象包含两个部分对象的组成元素是对象的数据模型,用于描述对象的数据又称为对象的属性,或者对象的成员变量对象的行为是对象的行为模型,用于描述对 一、面向对象的概念 1.1 什么是面向对象(object oriented) 世间万物皆对象,抽象的也是对象,一切可见或不可见都是对象 ...
摘要:类与对象基本概念如果在之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。如果一个类被声明为,则不能被继承。命名空间通过关键字来声明。 类与对象 基本概念 new:如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。 Example #3 创建一个实例 ...
阅读 2217·2021-11-25 09:43
阅读 3064·2021-10-14 09:42
阅读 3456·2021-10-12 10:12
阅读 1464·2021-09-07 10:17
阅读 1857·2019-08-30 15:54
阅读 3150·2019-08-30 15:54
阅读 1490·2019-08-30 15:53
阅读 1815·2019-08-29 11:21