Jer*_*gan 37
封装只是将一些数据包装在一个对象中.术语"封装"通常与"信息隐藏"互换使用.维基百科有一篇很好的文章.
以下是Google搜索"php encapsulation"中第一个链接的示例:
<?php
class App {
private static $_user;
public function User( ) {
if( $this->_user == null ) {
$this->_user = new User();
}
return $this->_user;
}
}
class User {
private $_name;
public function __construct() {
$this->_name = "Joseph Crawford Jr.";
}
public function GetName() {
return $this->_name;
}
}
$app = new App();
echo $app->User()->GetName();
?>
Run Code Online (Sandbox Code Playgroud)
Sam*_*igh 12
封装是您的类和数据结构的保护机制.它让您的生活更轻松.使用Encapsulation,您可以使用控件来访问和设置类参数和方法.您可以控制哪些部分对外人可见,以及如何设置对象参数.
访问和设置类参数
(好办法)
<?php
class User
{
private $gender;
public function getGender()
{
return $this->gender;
}
public function setGender($gender)
{
if ('male' !== $gender and 'female' !== $gender) {
throw new \Exception('Set male or female for gender');
}
$this->gender = $gender;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以从User类创建对象,并可以安全地设置性别参数.如果您为类设置了任何错误,那么它将抛出异常.您可能认为这是不必要的,但是当您的代码增长时,您会希望看到有意义的异常消息,而不是系统中的尴尬逻辑问题,没有例外.
$user = new User();
$user->setGender('male');
// An exception will throw and you can not set 'Y' to user gender
$user->setGender('Y');
Run Code Online (Sandbox Code Playgroud)
(坏道)
如果您不遵循Encapsulation角色,那么您的代码将是这样的.很难维护.请注意,我们可以为用户性别属性设置任何内容.
<?php
class User
{
public $gender;
}
$user = new User();
$user->gender = 'male';
// No exception will throw and you can set 'Y' to user gender however
// eventually you will face some logical issue in your system that is
// very hard to detect
$user->gender = 'Y';
Run Code Online (Sandbox Code Playgroud)
访问类方法
(好办法)
<?php
class User
{
public function doSomethingComplex()
{
$this->doThis(...);
...
$this->doThat(...);
...
$this->doThisExtra(...);
}
private function doThis(...some Parameters...)
{
...
}
private function doThat(...some Parameters...)
{
...
}
private function doThisExtra(...some Parameters...)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我们都知道我们不应该用200行代码来创建一个函数,而应该将它分解为一些破坏代码并提高代码可读性的单独函数.现在使用封装,您可以将这些功能设置为私有,这意味着外部人员无法访问它们,以后当您想要修改某个功能时,当您看到私有关键字时,您会非常高兴.
(坏道)
class User
{
public function doSomethingComplex()
{
// do everything here
...
...
...
...
}
}
Run Code Online (Sandbox Code Playgroud)
封装是一种将对象或数据作为属性存储在另一个对象中的方式,以便外部对象可以完全控制内部数据或对象的访问方式.
例如
class OuterClass
{
private var $innerobject;
function increment()
{
return $this->innerobject->increment();
}
}
Run Code Online (Sandbox Code Playgroud)
在封装的对象周围有一个额外的层,它允许外部对象控制如何访问内部对象.这与内部对象/属性相结合private,可以实现信息隐藏.
| 归档时间: |
|
| 查看次数: |
73912 次 |
| 最近记录: |