[源码下载]
作者:webabcd
介绍
速战速决 之 PHP
- 类基础
- 抽象类
- 接口
- trait
示例
1、类的相关知识点 1(基础)
class/class1.php
<span>php </span><span>/*</span><span>* * 类的相关知识点 1(基础) * * 规范:命名空间与目录路径对应,类名与文件名对应,文件以 .class.php 为后缀名 </span><span>*/</span><span>class</span><span> MyClass1 { </span><span>//</span><span> 类常量,没有“$”符号,不能被覆盖</span><span>const</span> MyConstant = 'constant value'<span>; </span><span>//</span><span> 静态属性</span><span>static</span><span>$myStaticProperty</span> = "static property"<span>; </span><span>//</span><span> 对于属性和方法的访问控制有 private protected public(默认值)</span><span>private</span><span>$_name</span><span>; </span><span>private</span><span>$_age</span><span>; </span><span>//</span><span> 构造函数 // PHP 中的魔术方法(magic method)均以 __(两个下划线)开头(类似的还有 __destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state() 和 __clone() 等)</span><span>function</span><span> __construct() { </span><span>echo</span> "MyClass1 construct"<span>; </span><span>echo</span> "<br>"<span>; </span><span>//</span><span> 获取参数个数</span><span>$args_num</span> = <span>func_num_args</span><span>(); </span><span>if</span> (<span>$args_num</span> == 1<span>) { </span><span>//</span><span> $this 代表当前对象,是指向类实例的指针</span><span>$this</span>->_name = <span>func_get_arg</span>(0<span>); } </span><span>else</span><span>if</span> (<span>$args_num</span> == 2<span>) { </span><span>$this</span>->_name = <span>func_get_arg</span>(0<span>); </span><span>$this</span>->_age = <span>func_get_arg</span>(1<span>); } </span><span>else</span><span> { } } </span><span>//</span><span> 析构函数</span><span>function</span><span> __destruct() { </span><span>print</span> "MyClass1 destruct"<span>; </span><span>echo</span> "<br>"<span>; } </span><span>//</span><span> 构造函数,此种方式在 PHP 5.3.3 或以上可支持 // 此种方式的构造函数也可以当做方法被调用</span><span>public</span><span>function</span><span> MyClass1() { </span><span>echo</span> "i am not a construct, i am a method"<span>; } </span><span>//</span><span> 静态方法</span><span>public</span><span>static</span><span>function</span><span> myStaticMethod() { </span><span>return</span> "static method"<span>; } </span><span>//</span><span> 方法</span><span>public</span><span>function</span><span> getInfo() { </span><span>//</span><span> $this 代表当前对象,是指向类实例的指针</span><span>return</span> "name: " . <span>$this</span>->_name . ", age: " . <span>$this</span>-><span>_age; } </span><span>//</span><span> 不直接支持方法的重载(overload),可以通过相关的魔术方法来实现(参见:class3.php) // public function getInfo($name) { } // 带参数类型约束的方法,类型约束不能用于 int 或 string 之类的标量类型 // 本例约束了参数 $ary 必须是 array 类型</span><span>public</span><span>function</span> getFirst(<span>array</span><span>$ary</span><span>) { </span><span>return</span><span>$ary</span>[0<span>]; } } </span><span>//</span><span> 被声明为 final 的类或属性或方法,无法继承 // 只能继承一个类</span><span>final</span><span>class</span> MyClass2 <span>extends</span><span> MyClass1 { </span><span>//</span><span> 构造函数可以为参数设置默认值(方法或函数也可以为参数设置默认值)</span><span>function</span> __construct(<span>$name</span> = "wanglei", <span>$age</span> = 100<span>) { </span><span>echo</span> "MyClass2 construct"<span>; </span><span>echo</span> "<br>"<span>; </span><span>//</span><span> parent 代表当前类的基类</span> parent::__construct(<span>$name</span>, <span>$age</span><span>); </span><span>//</span><span> self 代表当前类 // $this 代表当前对象,是指向类实例的指针</span><span> } </span><span>//</span><span> 析构函数</span><span>function</span><span> __destruct() { </span><span>print</span> "MyClass2 destruct"<span>; </span><span>echo</span> "<br>"<span>; parent</span>::<span>__destruct(); } </span><span>//</span><span> 覆盖基类的同名方法(override)</span><span>public</span><span>function</span><span> getInfo() { </span><span>//</span><span> $this 代表当前对象,指向类实例的指针</span><span>return</span> "MyClass2 - " . parent::<span>getInfo(); } } </span><span>//</span><span> 类的实例化</span><span>$objClass1</span> = <span>new</span> MyClass1("webabcd", 35<span>); </span><span>//</span><span> 通过 -> 调用实例方法或实例属性</span><span>echo</span><span>$objClass1</span>-><span>getInfo(); </span><span>echo</span> "<br>"<span>; </span><span>//</span><span> 通过 -> 调用实例方法或实例属性(MyClass1() 是构造函数,也可以当做方法被调用)</span><span>echo</span><span>$objClass1</span>-><span>MyClass1(); </span><span>echo</span> "<br>"<span>; </span><span>$objClass2</span> = <span>new</span><span> MyClass2(); </span><span>echo</span><span>$objClass2</span>-><span>getInfo(); </span><span>echo</span> "<br>"<span>; </span><span>//</span><span> instanceof - 用于判断一个对象是否是指定类的实例</span><span>if</span>(<span>$objClass2</span><span> instanceof MyClass1) { </span><span>echo</span> '$objClass2 instanceof MyClass1'<span>; </span><span>echo</span> "<br>"<span>; } </span><span>//</span><span> 通过 :: 调用类常量或静态属性或静态方法</span><span>echo</span> MyClass1::<span>MyConstant; </span><span>echo</span> "<br>"<span>; </span><span>//</span><span> 通过 :: 调用类常量或静态属性或静态方法</span><span>echo</span> MyClass1::<span>$myStaticProperty</span><span>; </span><span>echo</span> "<br>"<span>; </span><span>//</span><span> variable class(可变类),将变量的值作为类名</span><span>$className</span> = 'MyClass1'<span>; </span><span>//</span><span> variable method(可变方法),将变量的值作为方法名</span><span>$methodName</span> = 'myStaticMethod'<span>; </span><span>//</span><span> 通过 :: 调用类常量或静态属性或静态方法</span><span>echo</span><span>$className</span>::<span>$methodName</span><span>(); </span><span>echo</span> "<br>"<span>; </span><span>//</span><span> 调用带参数类型约束的方法</span><span>echo</span><span>$objClass1</span>->getFirst(<span>array</span>("a", "b", "c"<span>)); </span><span>echo</span> "<br>";
2、类的相关知识点 2(抽象类,接口,trait)
class/class2.php
<span>php </span><span>/*</span><span>* * 类的相关知识点 2(抽象类,接口,trait) </span><span>*/</span><span>//</span><span> 抽象类</span><span>abstract</span><span>class</span><span> MyAbstractClass { </span><span>//</span><span> 抽象方法,子类必须定义这些方法</span><span>abstract</span><span>protected</span><span>function</span><span> getValue1(); </span><span>abstract</span><span>public</span><span>function</span> getValue2(<span>$param1</span><span>); </span><span>//</span><span> 普通方法(非抽象方法)</span><span>public</span><span>function</span><span> getValue0() { </span><span>return</span> "getValue0"<span>; } } </span><span>//</span><span> 接口</span><span>interface</span><span> MyInterface1 { </span><span>//</span><span> 接口常量,不能被覆盖</span><span>const</span> MyConstant = 'constant value'<span>; </span><span>public</span><span>function</span><span> getValue3(); } </span><span>//</span><span> 接口</span><span>interface</span> MyInterface2 <span>extends</span><span> MyInterface1 { </span><span>public</span><span>function</span><span> getValue4(); } </span><span>//</span><span> 接口</span><span>interface</span><span> MyInterface3 { </span><span>public</span><span>function</span><span> getValue5(); } </span><span>//</span><span> trait(可以 use 多个,允许有实现代码,但是本身不能实例化)</span><span>trait MyTrait1 { </span><span>//</span><span> 可以具有方法,静态方法,属性等</span><span>function</span><span> getValue6() { </span><span>return</span> "getValue6"<span>; } } </span><span>//</span><span> trait(可以 use 多个,允许有实现代码,但是本身不能实例化)</span><span>trait MyTrait2 { </span><span>//</span><span> 抽象方法(use 这个 trait 的类必须要定义这个方法)</span><span>abstract</span><span>function</span><span> getValue7(); } </span><span>//</span><span> trait(可以 use 多个,允许有实现代码,但是本身不能实例化)</span><span>trait MyTrait3 { </span><span>function</span><span> getValue6() { </span><span>return</span> "getValue6"<span>; } </span><span>function</span><span> getValue8() { </span><span>return</span> "getValue8"<span>; } } </span><span>//</span><span> 必须实现所有抽象方法和接口方法 // 类只能单继承,接口可以多继承</span><span>class</span> MyClass1 <span>extends</span> MyAbstractClass <span>implements</span> MyInterface2,<span> MyInterface3 { </span><span>//</span><span> 可以 use 多个 trait</span><span>use</span> MyTrait1,<span> MyTrait2; </span><span>use</span><span> MyTrait3 { </span><span>//</span><span> 多 trait 间有重名的,可以指定以哪个为准</span> MyTrait1::<span>getValue6 insteadof MyTrait3; </span><span>//</span><span> 可以为 trait 的指定方法设置别名(调用的时候用方法名也行,用别名也行)</span> MyTrait3::getValue8 <span>as</span><span> alias; } </span><span>//</span><span> 可以将 protected 升级为 public</span><span>public</span><span>function</span><span> getValue1() { </span><span>return</span> "getValue1"<span>; } </span><span>//</span><span> 可以加参数,但是加的参数必须要有默认值</span><span>public</span><span>function</span> getValue2(<span>$param1</span>, <span>$param2</span> = 'param2'<span>) { </span><span>return</span> "getValue2, {<span>$param1</span>}, {<span>$param2</span>}"<span>; } </span><span>public</span><span>function</span><span> getValue3() { </span><span>return</span> "getValue3"<span>; } </span><span>public</span><span>function</span><span> getValue4() { </span><span>return</span> "getValue4"<span>; } </span><span>public</span><span>function</span><span> getValue5() { </span><span>return</span> "getValue5"<span>; } </span><span>public</span><span>function</span><span> getValue7() { </span><span>return</span> "getValue7"<span>; } } </span><span>//</span><span> 调用接口常量</span><span>echo</span> MyInterface1::<span>MyConstant; </span><span>echo</span> "<br>"<span>; </span><span>$myClass1</span> = <span>new</span><span> MyClass1; </span><span>echo</span><span>$myClass1</span>-><span>getValue0(); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>-><span>getValue1(); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>->getValue2("webabcd"<span>); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>-><span>getValue3(); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>-><span>getValue4(); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>-><span>getValue5(); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>-><span>getValue6(); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>-><span>getValue7(); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>-><span>getValue8(); </span><span>echo</span> "<br>"<span>; </span><span>echo</span><span>$myClass1</span>-><span>alias(); </span><span>echo</span> "<br>";
OK
[源码下载]
以上就介绍了速战速决 4 - PHP: 类基础, 抽象类, 接口, trait,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

PHP在现代Web开发中仍然重要,尤其在内容管理和电子商务平台。1)PHP拥有丰富的生态系统和强大框架支持,如Laravel和Symfony。2)性能优化可通过OPcache和Nginx实现。3)PHP8.0引入JIT编译器,提升性能。4)云原生应用通过Docker和Kubernetes部署,提高灵活性和可扩展性。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优势,适合不同场景。1.PHP适用于web开发,提供内置web服务器和丰富函数库。2.Python适合数据科学和机器学习,语法简洁且有强大标准库。选择时应根据项目需求决定。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP成为许多网站首选技术栈的原因包括其易用性、强大社区支持和广泛应用。1)易于学习和使用,适合初学者。2)拥有庞大的开发者社区,资源丰富。3)广泛应用于WordPress、Drupal等平台。4)与Web服务器紧密集成,简化开发部署。

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

WebStorm Mac版
好用的JavaScript开发工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver Mac版
视觉化网页开发工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。