php中简单示例的封装是什么?
14 回答
封装只是将一些数据包装在一个对象中。术语“封装”通常与“信息隐藏”互换使用。维基百科有一篇相当详尽的文章。
以下是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();
?>
封装是您的类和数据结构的保护机制。它使您的生活更加轻松。使用封装,您可以控制访问和设置类参数和方法。您可以控制说明哪些部分对外人可见,以及如何设置您的对象参数。
访问和设置类参数
(好办法)
<?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;
}
}
现在您可以从 User 类创建一个对象,并且可以安全地设置性别参数。如果你为你的班级设置了任何错误的东西,那么它将抛出异常。您可能认为这是不必要的,但是当您的代码增长时,您希望看到有意义的异常消息,而不是系统中没有异常的尴尬逻辑问题。
$user = new User();
$user->setGender('male');
// An exception will throw and you can not set 'Y' to user gender
$user->setGender('Y');
(不好的方式)
如果您不遵循封装角色,那么您的代码将是这样的。非常难维护。请注意,我们可以为用户性别属性设置任何内容。
<?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';
访问类方法
(好办法)
<?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...)
{
...
}
}
我们都知道,我们不应该用 200 行代码来做一个函数,而应该把它分解成一些单独的函数,这样可以破坏代码并提高代码的可读性。现在通过封装,您可以将这些函数设为私有,这意味着外部人员无法访问它,以后当您想要修改一个函数时,当您看到 private 关键字时,您会非常高兴。
(不好的方式)
class User
{
public function doSomethingComplex()
{
// do everything here
...
...
...
...
}
}
封装是一种将代码和它操作的数据绑定在一起的机制,它可以保护两者免受外部干扰和误用。将数据和方法封装到一个单元(称为类)中称为封装。封装的好处是它在内部执行任务而不用担心。
封装是将对象或数据作为属性存储在另一个对象中的一种方式,这样外部对象就可以完全控制如何访问内部数据或对象。
例如
class OuterClass
{
private var $innerobject;
function increment()
{
return $this->innerobject->increment();
}
}
您在封装的对象周围有一个额外的层,它允许外部对象控制如何访问内部对象。这与制作内部对象/属性相结合private
,可以隐藏信息。
/* class that covers all ATM related operations */
class ATM {
private $customerId;
private $atmPinNumber;
private $amount;
// Verify ATM card user
public function verifyCustomer($customerId, $atmPinNumber) {
... function body ...
}
// Withdraw Cash function
public function withdrawCash($amount) {
... function body ...
}
// Retrieve mini statement of our account
public function miniStatement() {
... function body ...
}
}
在上面的示例中,我们使用私有访问修饰符声明了所有 ATM 类属性(变量)。它只是意味着外部世界的最终用户不能直接访问 ATM 类属性。因此,外部世界的最终用户无法直接更改或更新它们。
更改类属性(数据)的唯一可能方法是方法(函数)。这就是我们使用公共访问修饰符声明 ATM 类方法的原因。用户可以将所需的参数传递给类方法以执行特定操作。
这意味着用户没有 ATM 类的完整实现细节。它简称为数据隐藏。
参考: http ://www.thecreativedev.com/php-encapsulation-with-simple-example/
人们似乎将面向对象的细节与封装混为一谈,这是一个更古老、更广泛的概念。封装的数据结构
- 可以使用单个引用传递,例如 increment(myDate) 而不是 increment(year,month,day)
- 具有存储在单个程序单元(类、模块、文件等)中的一组适用操作
- 不允许任何客户端查看或操作其子组件,除非通过调用适用的操作
您几乎可以用任何语言进行封装,并且在模块化和可维护性方面获得了巨大的好处。
将数据成员和方法一起包装成一个单元(即类)称为封装。 封装就像封装在一个胶囊中。也就是将与一个对象相关的相关操作和数据封装到该对象中。封装就像你的包,你可以把你的笔、书等放在里面。这意味着这是封装成员和函数的属性。
<?php
class YourMarks
{
private $mark;
public Marks
{
get { return $mark; }
set { if ($mark > 0) $mark = 10; else $mark = 0; }
}
}
?>
我再举一个现实生活(日常使用)的例子,那就是“电视操作”。许多人在日常生活中操作电视。
它是用盖子封装的,我们可以用遥控器操作,不需要打开电视和改变频道。除了远程之外,这里的一切都是私密的,因此任何人都可以访问而不是操作和更改电视中的内容。
封装: - 将数据包装在单个单元中。我们也可以说隐藏了重要细节的信息。 示例:您有一部手机....那里有一些界面可以帮助您与手机进行交互,您可以使用手机的服务。但实际上在手机中工作是隐藏的。你不知道它在内部是如何工作的。
封装是向外界隐藏对象数据的过程,并且仅限于类的成员对其进行访问。
封装的反面是将变量传递给每个方法(就像每个文件相关方法的文件句柄)或全局变量。
只是我更喜欢你的类的属性和方法的可见性。例如--公共-私有-保护
让我们看一个真实的封装示例。
class MyClass{
private $name;
public function showName($newName){
$this->name = $newName;
return $this->name;
}
}
//instantiate object
$obj = new MyClass();
echo $obj->showName("tisuchi");
在这种情况下,封装意味着,我们限制了一些属性。比如,name 属性,我们不能从类外部访问。另一方面,我们可以使用一个私有参数访问名为 showName() 的公共函数。
简单地说,我更喜欢封装是-
您的属性和方法的可见性。
虽然,如果您有任何进一步了解封装的意图,我会参考我的基于封装的特殊教程。
http://tisuchi.com/object-oriented-php-part-3-encapsulation-php/
希望,它会让你的概念更清晰。玩得开心!
基本上,这是我们定义属性和方法可见性的方式。在创建类时,您必须问自己可以在类之外访问哪些属性和方法。假设我们有一个名为 foo 的属性。如果一个类扩展了您的类,是否允许操作和访问 foo?如果有人创建了你的类的实例怎么办?他们是否允许操纵和访问 foo?
将数据封装在单个单元内称为封装。意味着方法和属性等类成员在类内部绑定在一起,以避免从外部访问。这是通过将类的变量和函数设为私有来完成的。
封装就是您希望对象/方法或属性/变量在应用程序中可见的方式。例如, :
class ecap {
public $name;
private $id;
protected $tax;
}
如果要访问私有或受保护的属性,则必须在类中使用可从类外部访问的 getter 和 setter 方法。这意味着,您不能直接从类外部访问您的私有或受保护属性,但您可以通过任何方法使用。让我们来看看-
在类中,添加以下方法:
class ecap
{
public function userId(){
return $this->id;
}
}
我们可以像这样访问它:
$obj = new ecap();
echo $obj->userId();