第四节:PHP变量作用域公共属性与私有属性

PHP面向对象编程基础

PHP变量作用域-公共与私有属性或方法的访问控制

PHP变量作用域,对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。变量的范围即它定义的上下文背景(也就是它的生效范围)。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。

这节课给大家简单的举例说明在php类和对象之公有属性与私有属性用法,属性方法在这个类是前面有关键字public,现在这个关键字也被称为可见性标记,私有和受保护是另外两个可见性标记。protected(受保护)稍后学习,现在学习关键词public,电子邮箱和密码的属性可被用户外的世界读取和阅读。

PHP变量作用域-公共属性与私有属性实例演示

PHP变量作用域-公共属性与私有属性实例演示

PHP变量作用域-公共属性与私有属性

实例演示开始请使用PHP类常量和内容引用代码跟着下面步骤操作。

如果我们把public $password修改为private $password

让我们在index.php输出var_dump($peter->password)看看结果:

是报错信息,因为我们没有访问password属性的权限。

如果我们直接在index.php设置password

报同样的错误:

所以像这样的PHP变量作用域标记是一种表示一个属性或方法应该对应用程序的其余部分是否可见,到底为什么要隐藏来自外部世界的属性?这是面向对象编程的目标之一就是将数据处理封装在对象中,一个对象像一个黑匣子,外面的世界不知道它的内部运作,它只是给你的对象提供参数,并得到一个回应。

一个对象能够真正独立于应用程序的其他部分,你可以改变所有对象的整个返回的方式,它不会破坏你的应用程序的其余部分。你可以说这个对象是私有的,非常强大的东西。在这种情况下,你可能会争辩说,负责设置和返回密码值的唯一实体应该是用户本身,答案将不会与存储值的位置或经过验证的任何方式进行过滤或验证无关。

它只是需要一种方法来获取和设置该属性值,但没有直接访问该属性本身。在我们的user类中,已经是一个很好例子。如果user类以外的人不能直接更改用户的密码,则可以很容易地使用1234,更糟糕的是,它只能以纯文本形式存储。这正是我们用setPassword这个方法创建密码的例子。如果你想从外部更改密码,则必须在此处使用此方法,并且该方法将确保密码在存储之前经过适当的验证和hash处理。

在user.php的user类中创建另外一个获取密码的方法:

在index.php添加输出代码:

让我们刷新index.php看看输出的结果:

所以在这里,我们只是建立了一个简单的API从外部获取密码,而实际上这些设置和获取方法在OOP中是相当普遍的做法,叫setters和getters,他们习惯于向公共提供私有属性。

email的操作方法也是一样的,把public $email改为private $email,创建setEmail方法和getEmail的方法:

在user类里面,我们也可以创建private的方法,例如valiatePassword:

回到setPassword方法把if (strlen($string) < self::MINCHARS)修改为if ($this->validatePassword($string) == false)

额外知识点:

这个validatePassword私有方法在这个user类可以重复使用,但是外面不能够访问,如果想要公共访问到,可以把private修改public或者删除private:

上述这个写法会被公共访问到,就像添加public关键词一样。

下载本课堂完整源码

Last modified: 2019年11月14日

Previous Story

PHP面向对象编程基础

第三节:PHP类常量和内部引用

PHP类常量和内部引用,可以把在类中始终保持不变的值定义为常量,在定义和使用常量的时候不需要使用 $ 符号。常 …

...

Next Story

PHP面向对象编程基础

第五节:PHP对象复制

PHP对象复制:从一个类创建一个对象并复制它几次可能是有用的,对象是通过引用而不是按值复制的,但这到底意味着什么呢?

...