PHP类和对象的简单介绍和概念是什么
Admin 2022-10-29 群英技术资讯 248 次浏览
自 PHP 5 起完全重写了对象模型以得到更佳性能和更多特性。这是自 PHP 4 以来的最大变化。PHP 5 具有完整的对象模型。
PHP 5 中的新特性包括访问控制,抽象类和 final 类与方法,附加的魔术方法,接口,对象复制和类型约束。
PHP 对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝。
每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
类名可以是任何非 PHP 保留字的合法标签。一个合法类名以字母或下划线开头,后面跟着若干字母,数字或下划线。以正则表达式表示为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。
一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。
Example #1 简单的类定义
<?php class SimpleClass { //声明属性 public $var = '1'; //声明方法 public function displayVar(){ echo $this->var; } } ?>
当一个方法在类定义内部被调用时,有一个可用的伪变量 $this。$this 是一个到主叫对象的引用(通常是该方法所从属的对象,但如果是从第二个对象静态调用时也可能是另一个对象)。
Example #2 $this 伪变量的示例
<?php class A { function foo() { if(isset($this)){ echo '$this is defined ('; echo get_class($this); echo ')<br>'; }else{ echo '$this is not defined.<br>'; } } } class B { function bar() { //如果开启了E_STRICT这一行会有警告提示 A::foo(); } } $a = new A(); $a -> foo(); //如果开启了E_STRICT这一行会有警告提示 A::foo(); $b = new B(); $b -> bar(); //如果开启了E_STRICT这一行会有警告提示 B::bar(); ?>
输出结果:
$this is defined (A) $this is not defined. $this is defined (B) $this is not defined.
要创建一个类的实例,必须使用 new 关键字。当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。类应在被实例化之前定义(某些情况下则必须这样)。
如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。
Example #3 创建一个实例
<?php $instance = new SimpleClass(); //也可以这样做: $className = "Foo"; $instance = new $className(); //Foo() ?>
在类定义内部,可以用 new self 和 new parent 创建新对象。
当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。
Example #4 对象赋值
include_once('class1.php'); $instance = new SimpleClass(); $assigned = $instance; $reference = & $instance; $instance -> var = '$assigned will have this value'; $instance = null; //$instance和$reference变成null var_dump($instance); var_dump($reference); var_dump($assigned);
输出结果是:
NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned will have this value" }
PHP 5.3.0 引进了两个新方法来创建一个对象的实例:
class Test { static public function getNew() { return new static; } } class Child extends Test {} $obj1 = new Test(); $obj2 = new $obj1; var_dump($obj1 !== $obj2); $obj3 = Test::getNew(); var_dump($obj3 instanceof Test); $obj4 = Child::getNew(); var_dump($obj4 instanceof Child);
输出结果:
bool(true) bool(true) bool(true)
一个类可以在声明中用 extends 关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类(与java一样都是单继承)。
被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性。
当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。
Example #6 简单的类继承:
class ExtendClass extends SimpleClass { //重写父类的方法 function displayVar() { echo "Extending class<br>"; parent::displayVar(); } } $extended = new ExtendClass(); $extended -> displayVar();
输出结果:
Extending class 1
自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。
Example #7 类名的解析
namespace NS{ class ClassName{} echo ClassName::class; }
输出结果:
NS\ClassName
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章通过两个实例讲解了PHP中删除字符串中的逗号以及尾部斜杠的方法,文中给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值
这篇文章主要给大家分享PHP回调函数处理数组的操作,具有一定的借鉴价值,感兴趣的朋友可以参考一下,希望大家阅读完这篇文章能有所收获,下面我们一起来学习一下吧。
这篇文章主要为大家介绍了关于php网络安全中session利用的小思路示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
在 PHP5 和 PHP7 中通过变量获取函数/方法名执行函数/方法时,可能会由于版本之间不通的解释策略导致相同的代码无法运行。
在Laravel中,控制反转的好处是能够借助IOC容器将具有依赖的模块或者对象进行解耦,如果指定的服务不合适使用时,不需要修改开发者定义的方法就可以通过指定的接口找一个合适的服务进行替换。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008