本节讲解的内容
静态属性和静态方法
访问修饰符
单例模式
魔术方法
类的自动加载
前言
在上一节中,我们介绍了面向对象的基本使用,但是上节的知识,在实际中还有问题是解决不了的,比如我们去买票,有一个总票数(定义票这个属性),来一个人买一张票(票-1),但是我们每次创建一个对象,根据对象在内存中的方式,都是重新创建一个总票数,这样是不合理,这里我们就使用到了静态这个概念,在PHP中类中的静态分为两种:
静态属性
静态方法
静态属性
静态属性是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量
<?php class Ticket{ public static $number = 100; //设置总的票数是100; public $name ; public function __construct($name){ $this-> name = $name; } //定义一个方法进行买票 public function sellTicket(){ echo $this-> name . '买票了<br>'; self::$number--; //每调用一次方法总票数就减一。 } } $people1 = new Ticket('小白'); $people2 = new Ticket('小明'); $people3 = new Ticket('小华'); $people4 = new Ticket('小张'); //每个人进行买票 $people1 -> sellTicket(); $people2 -> sellTicket(); $people3 -> sellTicket(); $people4 -> sellTicket(); echo Ticket::$number; //在类的外部通过类名访问静态属性。 ......结果........ 小白买票了 小明买票了 小华买票了 小张买票了 96
在上面的代码中可以看到静态属性的定义方式。
访问修饰符 static $静态属性名字 = 初始化值;
静态属性只能定义在类的内部。
静态属性的访问
在类外面
在类外面我们也是可以访问类中的静态属性的,就像上面写的那样通过类名来直接访问(只有权限修饰符是public的时候才能这样)Ticket::$number;其中::是范围解析符。
在类的外部还可以通过对象来对静态属性进行访问
$people4::$number;
通过类名进行访问是通过范围解析符::进行访问。
在类里面
上面的代码中,我们可以看到,在类中我们通过self::$静态属性名进行访问。除了这种方式,在类中还有一种方式来进行访问。
Ticket::$number--;
通过类名来访问。而推荐使用的格式是通过self这种方式,因为这种方式当我们的类名改变后,也不用修改。那么self和$this有什么区别呢?
$this和self的区别
其实在上节中讲到$this,是指向当前的对象的,而这里的self是指向当前类,一个指向对象,一个指向类,指向不同。同时他们两个的使用方式不一样self是两个::,$this是->。但是它们两个的适用范围是一样的,都是在类的内部使用。
静态属性的使用
在上面我们只是讲解了静态属性的定义方法以及使用方法,至于什么时候时候需要使用到静态属性。当我们在项目开发中,需要让所有的对象共享一份数据时,我们就考虑使用静态属性。
静态属性也是一个属性,那么它与普通属性的区别是:
属性加上static这个关键字,就会变成静态属性。
静态属性的属于类的,所有对象共享的属性
普通属性是属于单一对象的。
注意,就像上面的一样,在非静态方法中可以访问静态属性。;
静态方法
上面讲到静态属性,那么接下来就讲一讲静态方法。
<?php class Ticket{ public static $number = 100; //设置总的票数是100; public $name ; public function __construct($name){ $this-> name = $name; } public static function sayHello(){ echo '这是静态方法<br>'; } public function info(){ //在类的内部使用静态方法 self::sayHello(); //通过self访问 Ticket::sayHello();//通过类名的方式进行访问 } } $people1 = new Ticket('小白'); $people1 -> info(); $people1::sayHello(); //在类的外部通过对象名进行访问 Ticket::sayHello(); //通过类型进行访问。 ......结果........ 这是静态方法 这是静态方法 这是静态方法 这是静态方法
静态方法的定义方式是通过关键字static来定义的:
访问修饰符 static function 方法名(参数列表){ code.... }
静态方法的访问
在类外面
静态方法在类外边的访问形式和访问静态属性的方法是一样的(权限修饰符只有是public才可以在外部访问)。
通过类名::静态方法名进行访问
通过对象名::静态方法名(不推荐)
通过对象名->静态方法名。也就是访问方法的形式。
在类里面
在类里面访问静态方法的方式和访问静态属性的方法也是一样的
self::静态方法名
类名::静态方法名
静态方法的使用
那么我们在什么情况下使用静态方法呢?我们可以在操作静态属性的时候使用静态方法。
当我们需要操作静态属性时,我们考虑使用
在我们php开发中,经常会使用到一些模式,比如单例模式,工厂模式,观察者模式等,都使用使用静态方法.
注意:静态方法不能访问非静态属性;
访问修饰符
在上面的代码中和说明中,我们可以看到不管是在属性的前面还是在方法的前面都有一个public,这个public就是访问修饰符其中的一种。访问修饰符可以说是实现对象封装的方法。
访问修饰符的分类及区别
在PHP中访问修饰符可以分为三中
public 在上面的代码中我们都是使用的public,使用这种这个关键字修饰的属性和方法,不管在类的内部还是在类的内部都是可以访问的。
-
protected(受保护的)如果使用这个关键字修饰,那么在类的外部是不能访问。只能在类的内部进行访问。
<?php class Cat{ public $name; protected $age; public function __construct($name,$age){ $this -> name = $name; $this -> age = $age; } } $cat = new Cat('小白',4); echo $cat -> name; //在类的外部访问public echo '<br>'; echo $cat -> age; //在类的外部访问protected修饰的属性。 ......结果..... 小白 Fatal error: Cannot access protected property Cat::$age in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\xiushifu.php on line 16
错误的信息是说不能访问protected修饰的属性。
private(私有的),只能在类的内部使用,在外部使用会报和上面一样的错误。
这三种,后面两种看起来作用一样,都是只能在类内部使用,那又有什么区别呢?现在看来,并没有区别,但是学过类的继承,那么这两种还是有区别的。
访问修饰符的使用:
成员属性必须制定访问修饰符,不然会报错
方法前面可以不写修饰符,默认是public
静态属性可以不指定访问修饰符,默认是public
单例模式
上面讲解到我们什么时候使用到静态方法。在一些设计模式中,我们可以使用到静态方法和静态属性。
设计模式:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。(百度)
在开发的时候,我们有这样的需求,在代码中我们创建一个对象,但是我们希望在一个项目中,这个对象实例只能有一个,不能创建多个对象,从而实现对数据库等资源的保护。这时候就使用到单例模式。
<?php class DaoMysql{ public $link; //模拟数据库连接 private static $instance;//当前类的对象。 private function __construct(){ echo '数据库连接<br>'; } public static function getInstance(){ if(self::$instance == null){ self::$instance = new DaoMysql(); } return self::$instance; } public function insertSql(){ echo '添加数据<br>'; } } $daoMysql = DaoMysql::getInstance(); $daoMysql -> insertSql(); $daoMysql2 = DaoMysql::getInstance(); $daoMysql2 -> insertSql(); ......结果....... 数据库连接 添加数据 添加数据
1. 既然是单例模式,那么就不能在外部创建对象,这就要把构造函数用private修饰(创建对象要调用构造函数,这里把构造函数私有化,调用不起来),这样在外部就不能创建对象。
2. 我们在类里面创建了一个对象的引用$instance,在类里面创建对象,这是允许的。
3. 在类中定义一个静态方法,我们就是通过这个方法来创建对象,通过类名::方法名进行创建,进去后先判断$instance是否为空,只有如空的时候我们才进行创建。然后返回对象。
4. 因为要在静态方法中访问属性,那么这个属性就应该是静态的属性。
5. 在类的外部通过类::静态方法名进行对象的创建。
6. 在结果中我们可以看到我们有两个对象,但是构造方法在第二次没有执行,说明对象没有创建。
虽然在上面我们做了很多限制,但是在PHP中还是有方法的到更过的对象,克隆和继承。
对象类型运算符
在上面的静态方法中判断对象是否创建还有一种方法。
if(!(self::$instance instanceof self)){ self::$instance = new DaoMysql(); }
其中instanceof就是类型运算符。 根据帮助文档,它有几个作用
用于确定一个 PHP 变量是否属于某一类 class 的实例:
可用来确定一个变量是不是继承自某一父类的子类的实例:
也可用于确定一个变量是不是实现了某个接口的对象的实例:
上面的代码中self代表当前的类。instanceof判断前面的变量是否是后面类的实例,然后取反。
魔术方法
在PHP中有一些定义在类中的神奇的方法,称为魔术方法。具体的魔术的方法的使用可以看另外一篇博客
PHP的魔术方法
类的自动加载
在前面我们讲过文件的引入,使用include和require这两种类型。在开发中我们有时需要引入大量的文件,可以是10个,也可能是20个,如果还是使用原来的方法,累人。
在 PHP 5 中,不再需要这样了。可以定义一个 __autoload() 函数,它会在试图使用尚未被定义的类时自动调用。
而我们在写类的时候,一般都是一个类一个文件,而文件的名字我们一般是类名.class.php的格式。
<?php //自动加载的方法,当我们使用这个文件不存在的类的时候,就会自动加载。 function __autoload($class_name){ require_once './' . $class_name . '.class.php'; } $dao = new Dao('小白',5); $cat = new Cat('小花',2); $dao -> eat(); $cat -> eat();
__autoload($类名),在个函数不是写在类中的,所以前面是没有权限修饰符。
上面的自动加载方式是有局限性的,当文件是在不同的文件夹中的时候,这种方法显然是不行的。这时候可以创建一个数组,把类名当做键,对应的路径当成值,进行存储。自动加载的时候就能正确的引入。
<?php $path = array( 'Dao' => './dao/Dao.class.php', 'Cat' => './cat/Cat.class.php' ); //自动加载的方法,当我们使用这个文件不存在的类的时候,就会自动加载。 function __autoload($class_name){ global $path; require_once $path[$class_name]; } $dao = new Dao('小白',5); $cat = new Cat('小花',2); $dao -> eat(); $cat -> eat();
可以看到在前面定义了一个数组用来存储路径。
注意:在函数中使用global声明一下,才能使用全局变量。
总结
在面向对象中用到静态属性和静态方法的时候还是很多的。同时权限修饰符在面向对象中是很重要的,因为我们通过修饰符控制访问权限。魔术方法的掌握,也可以让我们在访问中明白各种调理机制。
以上就是PHP基础教程十之静态属性和静态方法的内容,更多相关内容请关注PHP中文网(www.php.cn)!

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

HTTP缓存头的关键玩家包括Cache-Control、ETag和Last-Modified。1.Cache-Control用于控制缓存策略,示例:Cache-Control:max-age=3600,public。2.ETag通过唯一标识符验证资源变化,示例:ETag:"686897696a7c876b7e"。3.Last-Modified指示资源最后修改时间,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP是一种服务器端脚本语言,用于动态网页开发和服务器端应用程序。1.PHP是一种解释型语言,无需编译,适合快速开发。2.PHP代码嵌入HTML中,易于网页开发。3.PHP处理服务器端逻辑,生成HTML输出,支持用户交互和数据处理。4.PHP可与数据库交互,处理表单提交,执行服务器端任务。

PHP在过去几十年中塑造了网络,并将继续在Web开发中扮演重要角色。1)PHP起源于1994年,因其易用性和与MySQL的无缝集成成为开发者首选。2)其核心功能包括生成动态内容和与数据库的集成,使得网站能够实时更新和个性化展示。3)PHP的广泛应用和生态系统推动了其长期影响,但也面临版本更新和安全性挑战。4)近年来的性能改进,如PHP7的发布,使其能与现代语言竞争。5)未来,PHP需应对容器化、微服务等新挑战,但其灵活性和活跃社区使其具备适应能力。

PHP的核心优势包括易于学习、强大的web开发支持、丰富的库和框架、高性能和可扩展性、跨平台兼容性以及成本效益高。1)易于学习和使用,适合初学者;2)与web服务器集成好,支持多种数据库;3)拥有如Laravel等强大框架;4)通过优化可实现高性能;5)支持多种操作系统;6)开源,降低开发成本。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

Atom编辑器mac版下载
最流行的的开源编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

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

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器