java内存可见性关键字
跟随系列...
这篇博客文章是“ 面向对象编程的完整指南:从过程编程到PHP的 OOP专家”的第四部分。
如果您还没有阅读其他部分
您可以通过以下链接查看其他博客文章
面向对象程序设计导论
PHP中的继承和接口 ,
可见性和静态关键字 ,
构造函数和魔术方法尚未发布,请订阅以得到通知并
尚未发布的抽象类和额外位,请订阅以得到通知
可见性概念简介
了解可见性和范围非常简单,
但是如果背景不够强,可能会造成混乱。
我不知道为什么,但是程序员总是喜欢定义一些奇特的词来描述简单的概念。
您已经看到了一些有关多态,继承的示例,现在您将要发现另一个单词:
封装。
这个精心设计的词意味着以其他代码不会影响数据的方式将数据收集在一起。
在以下示例中,您将了解范围的概念。
给定两个具有相同名称的变量$ schoolsCount ,一个将所有
我们城市中的一所学校,而另一所仅计算主要街道上的学校数量,您会发现结果会有所不同。
发生这种情况是因为第二个变量已封装在函数中,因此分配在不同的范围内。
我们可以通过使用超全局变量GLOBALS ['schoolCount']使用全局范围
但是,这不是一个好习惯,它会使代码很快变得混乱。
$schoolsCount
= 7;
function
getSchoolsCountInMainStreet () {
$schoolsCount
= 4;
return
var_dump($schoolsCount);
}
var_dump($schoolsCount); // This will output the total amount
在使用PHP的面向对象编程中,您有三个不同的地方
能见度水平。
他们是:
- 上市
- 受保护的
- 私人的
上市
公开是最基本的限制级别,
可以从代码中的任何位置,类内,子类甚至类外访问,查看和更新具有此级别的属性和方法。
PHP4之后具有可见性,并且具有复古兼容性
声明它不是强制性的,实际上,如果您不声明可见性
在元素上,代码会将其视为公开。
所以,
考虑到您到目前为止在本文中看到的所有示例均已公开声明。
消息人士称,这种情况不会持续下去,部署在PHP4中且仍在线的Web应用程序很少。
这意味着即使出于将来的兼容性原因,即使方法和属性是公共的,也需要养成声明可见性的习惯
受保护的
受保护的是第二级。
而且它很容易理解,因此我将不做过多介绍。
声明受保护的属性时,您要说的是,该变量在类内部以及扩展该类的任何类中都可用。
私人的
第三层是比较有限的
私有属性和方法只能在声明的类中访问。
没有子类,没有其他地方。
这种可见性用于处理非常敏感的信息,例如使用密码或处理付款数据时。
PHP语法命令我们在编写元素之前定义可见性。
让我们重写前面的示例:
class
Building
{
public
$inCostruction
= false;
protected
$isOpen
= true;
private
$safePassword
= “qwerty”
public
function
closeBuilding()
{
return
$this->isOpen = false;
}
protected
function
openBuilding()
{
return
$this->isOpen = true;
}
}
class
School extends
Building
{
}
class
Office extends
Building
{
$isOpen
= false;
}
当前$ inCostruction变量可在程序中的任何位置访问,
$ isOpen在子类的Building类中可见,而$ safePassword仅在Building类中可见,
学校和办公室都无法访问和更新$ safePassword变量。
这是PHP的一个非常基本的功能,但必须清楚理解。
当变量的范围错误时,由于可见性原因而发生的大多数错误都是致命错误
如果没有显示错误,那么您根本很难找到问题。
静态的
这是一个新PHP关键字供您学习。
他们永远不够
是不是
static关键字用于更改属性的可访问性和
方法。
通过将一个类的元素(属性或方法)声明为静态,您对代码说,该元素将对所有程序可用,而无需实例化该类。
由于没有实例化的关键字$ this在这些方法中不可用。
它由self ::关键字代替。
困惑?
让我们更清楚一点。
为什么首先使用static?
在前面的示例中,当我们创建城市时,我们使用的建筑类与蓝图相同,因此从中提取所需数据,并创建了实际对象,例如办公室,学校等。
为此,我们需要创建Building类的副本,并且我们执行的所有操作将仅更改实例化的对象,而不更改类本身。
这意味着我们在虚构的城市中可以有数十个,数百个甚至数千个Office,我们可以编辑每个Office而不影响其他Office。
$officeInMainStreet
= new
Office()
$officeInPiccadillyBoulevard= new
Office()
这两个对象是同一类的两个不同实例,
它们是使用相同的蓝图构建的,但它们不在同一办公室
您可以在其中一个窗口上添加窗口或重新粉刷墙壁,这不会有问题,因为另一个对象永远不会知道。
好吧,使用静态对象时会有所不同。
class
Building
{
public
static
$planningPermission
= ‘accepted’;
}
echo
Building::$planningPermission; // this command will echo “accepted”
在上面的示例中,我们不再尝试访问abject,而是直接访问属性,
所以,
您会看到echo实际类的实际静态参数。
如果要创建一个最终将编辑参数的方法,它将是将要更改的类的参数,而不是随后创建的某些实例中的一个。
静态方法的价值相同:
class
Building
{
public
static
$planningPermission
= ‘accepted’;
public
static
function
setDeniedPermission()
{
self::$planningPermission
= ‘denied’;
return
self::$planningPermission;
}
}
echo
Building::setDeniedPermission(); // this command will echo “denied”
这个概念使static关键字非常强大,但同时在许多开发人员看来也不是一件好事,因为考虑到它和全局范围的使用,通常这是一种不好的做法。
第四部分结论
无论何时,以下部分将以 Kindle格式在Kindle上提供完整版的“面向对象编程的完整指南”的完整版本 。
这是一篇简短的文章,向您表明了有关可见性和在PHP上使用static关键字的简单概念。
即使这些元素仅需要基本的知识并且可以立即应用,
没有人可以否认使用它们的重要性,
特别是如果正确应用。
很多方面,
选择受保护的或私有的可见性级别有助于Web开发人员定义可共享的内容以及保留在友好范围内的更好内容。
与此同时,
您已经了解到,现在可以声明类而无需实例化它们。
static关键字是该语言的另一个强大但危险的功能。
学习一些新关键字并开始在脚本中的任何地方使用它们是一个基本的错误。
但小心点,
滥用它,尤其是在开始时,可能导致完全重写已完成的功能(它发生在我身上,请从我的错误中吸取教训)。
在下一集中
我们将专注于魔术方法
我准备了完整的列表,其中包含详细的描述和代码示例。
为此原因,
请继续关注并使用此处的表单进行订阅,以在发布时得到通知。
现在轮到您了:
您是否要使用受保护的和私有关键字来更新方法和属性,还是更喜欢在各处传播静态关键字?
在下面的评论框中让我知道!
翻译自: https://hackernoon.com/visibility-and-static-keyword-in-php-f03c751c0c03
java内存可见性关键字