Sự khác biệt giữa công cộng, tư nhân và được bảo vệ là gì?


988

Khi nào và tại sao tôi nên sử dụng public, privateprotectedcác chức năng và các biến bên trong một lớp học? sự khác biệt giữa chúng là gì?

Ví dụ:

// Public
public $variable;
public function doSomething() {
  // ...
}

// Private
private $variable;
private function doSomething() {
  // ...
}

// Protected
protected $variable;
protected function doSomething() {
  // ...
}

59
Tôi nghĩ rằng câu hỏi này cũng sẽ được hưởng lợi từ các câu trả lời với các ví dụ thực tế về việc sử dụng từng câu, thay vì cung cấp định nghĩa theo nghĩa đen của mỗi từ khóa.
Matthew

70
Tôi thực sự nghĩ rằng câu hỏi này nên được công khai, không được bảo vệ.
dotancohen

Câu trả lời:


1260

Bạn sử dụng:

  • public phạm vi để làm cho thuộc tính / phương thức đó có sẵn từ bất cứ đâu, các lớp và thể hiện khác của đối tượng.

  • private phạm vi khi bạn muốn thuộc tính / phương thức của bạn chỉ hiển thị trong lớp riêng của nó.

  • protected phạm vi khi bạn muốn làm cho thuộc tính / phương thức của bạn hiển thị trong tất cả các lớp mở rộng lớp hiện tại bao gồm cả lớp cha.

Thêm: (Để biết thông tin toàn diện)


79
protectedphạm vi khi bạn muốn làm cho biến / hàm của bạn hiển thị trong tất cả các lớp mở rộng lớp hiện tại VÀ các lớp cha của nó .
Shahid

4
@Shahid - Tôi không hiểu quan điểm của bạn. Bất kỳ lớp nào mở rộng lớp A cũng mở rộng lớp cha của A, không?
JDelage

4
@JDelage - Vui lòng xem liên kếthttp://www.php.net/manual/en/language.oop5.visibility.php#109324
Shahid

4
@Growler Tại sao lại bận tâm sử dụng các đối tượng?
J.Steve

27
@Growler, một câu trả lời hữu ích hơn sẽ là tốt để che giấu càng nhiều hoạt động bên trong của một đối tượng càng tốt. Bằng cách đó, nó ít có khả năng phá vỡ. Nếu bạn đặt mọi thứ ở chế độ công khai, thì một lập trình viên khác có thể thay đổi một biến mà bạn không muốn thay đổi bởi bất kỳ thứ gì khác ngoài hoạt động bên trong của đối tượng.
Thư giãn tại Síp

1176

đ

Công cộng:

Khi bạn khai báo một phương thức (hàm) hoặc thuộc tính (biến) là public, các phương thức và thuộc tính đó có thể được truy cập bằng:

  • Cùng một lớp đã khai báo nó.
  • Các lớp kế thừa lớp khai báo ở trên.
  • Bất kỳ yếu tố nước ngoài nào ngoài lớp này cũng có thể truy cập vào những thứ đó.

Thí dụ:

<?php

class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->name; // The public variable will be available to the inherited class
    }

}

// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'

Được bảo vệ:

Khi bạn khai báo một phương thức (hàm) hoặc một thuộc tính (biến) là protected, các phương thức và thuộc tính đó có thể được truy cập bởi

  • Cùng một lớp đã khai báo nó.
  • Các lớp kế thừa lớp khai báo ở trên.

Thành viên bên ngoài không thể truy cập các biến. "Người ngoài cuộc" theo nghĩa họ không phải là đối tượng của chính lớp khai báo.

Thí dụ:

<?php

class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Lỗi chính xác sẽ là:

Lỗi nghiêm trọng của PHP: Không thể truy cập thuộc tính được bảo vệ GrandPa :: $ name


Riêng tư:

Khi bạn khai báo một phương thức (hàm) hoặc thuộc tính (biến) là private, các phương thức và thuộc tính đó có thể được truy cập bằng:

  • Cùng một lớp đã khai báo nó.

Thành viên bên ngoài không thể truy cập các biến. Người ngoài theo nghĩa họ không phải là đối tượng của chính lớp được khai báo và thậm chí là các lớp kế thừa lớp đã khai báo.

Thí dụ:

<?php

class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Các thông báo lỗi chính xác sẽ là:

Lưu ý: Tài sản không xác định: Daddy :: $ name
Lỗi nghiêm trọng: Không thể truy cập tài sản riêng GrandPa :: $ name


Phân tích Grandpa Class bằng Reflection

Chủ đề này không thực sự nằm ngoài phạm vi và tôi thêm nó vào đây chỉ để chứng minh rằng sự phản chiếu thực sự mạnh mẽ. Như tôi đã nêu trong ba ví dụ trên, protectedprivatecác thành viên (thuộc tính và phương thức) không thể được truy cập bên ngoài lớp.

Tuy nhiên, với sự phản ánh, bạn có thể làm điều khác thường bằng cách truy cập protectedprivatecác thành viên bên ngoài lớp học!

Vâng, phản ánh là gì?

Reflection thêm khả năng đảo ngược các lớp kỹ sư, giao diện, chức năng, phương thức và phần mở rộng. Ngoài ra, họ cung cấp các cách để lấy nhận xét doc cho các hàm, lớp và phương thức.

Lời nói đầu

Chúng tôi có một lớp được đặt tên Grandpasvà nói rằng chúng tôi có ba thuộc tính. Để dễ hiểu, hãy xem xét có ba grandpa với tên:

  • Đánh dấu Henry
  • John Clash
  • Will Jones

Hãy để chúng tôi làm cho chúng (gán sửa đổi) public, protectedprivatetương ứng. Bạn biết rất rõ rằng protectedprivatecác thành viên không thể được truy cập bên ngoài lớp học. Bây giờ chúng ta hãy mâu thuẫn với tuyên bố bằng cách sử dụng sự phản chiếu.

Mật mã

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected  modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}


# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;

# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

echo "<br>";

#Scenario 2: Using reflection

$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)


echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";

foreach($granpaNames as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

Đầu ra:

#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1

#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3

Quan niệm sai lầm phổ biến:

Xin đừng nhầm lẫn với ví dụ dưới đây. Như bạn vẫn có thể thấy, các thành viên privateprotectedkhông thể được truy cập bên ngoài lớp mà không sử dụng sự phản chiếu

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}

$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);

Đầu ra:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

Chức năng sửa lỗi

print_r, var_exportvar_dumpchức năng gỡ rối . Họ trình bày thông tin về một biến ở dạng người có thể đọc được. Ba hàm này sẽ tiết lộ các thuộc tính protectedprivatethuộc tính của các đối tượng với PHP 5. Các thành viên lớp tĩnh sẽ không được hiển thị.


Nhiêu tai nguyên hơn:



xin lỗi vì đã thêm vào convo này. Bạn có thể cho tôi biết tại sao ai đó sẽ sử dụng những thứ này? Bạn đã giải thích hoàn hảo cách chúng hoạt động, v.v. Tôi chỉ muốn biết lợi ích của việc sử dụng cho mỗi thứ này. Cảm ơn bạn
JamesG

@JamesG một chút giải thích trong bình luận khác ở trên. stackoverflow.com/questions/4361553/ từ
cjmling

Tôi không biết tại sao có thể có một chút câu hỏi này nhưng không ai đề cập rằng trong PHP có hai công cụ sửa đổi truy cập khác: trừu tượng và cuối cùng từ khóa này chỉ có thể được sử dụng cho các lớp PHP nhưng nó vẫn truy cập các công cụ sửa đổi
bxN5

1
Tôi muốn đề nghị bạn đọc phần giải thích về sự trừu tượng được cung cấp bởi Dhairya Lakhera tại đây: stackoverflow.com/questions/2558559/ trên . Nó là một bổ sung hoàn hảo cho lời giải thích Shankar Damodaran.
Julio Marchi

83

Nó thường được coi là thông lệ tốt để mặc định mức độ hiển thị thấp nhất được yêu cầu vì điều này thúc đẩy đóng gói dữ liệu và thiết kế giao diện tốt. Khi xem xét khả năng hiển thị của biến thành viên và phương thức, hãy nghĩ về vai trò của thành viên trong tương tác với các đối tượng khác.

Nếu bạn "mã hóa giao diện thay vì triển khai" thì thường sẽ khá đơn giản để đưa ra quyết định về khả năng hiển thị. Nói chung, các biến nên ở chế độ riêng tư hoặc được bảo vệ trừ khi bạn có lý do chính đáng để phơi bày chúng. Thay vào đó, hãy sử dụng các bộ truy cập công cộng (getters / setters) để giới hạn và điều chỉnh quyền truy cập vào nội bộ của một lớp.

Để sử dụng một chiếc xe như một sự tương tự, những thứ như tốc độ, bánh răng và hướng sẽ là các biến thể riêng tư. Bạn không muốn người lái trực tiếp thao tác với những thứ như tỷ lệ không khí / nhiên liệu. Thay vào đó, bạn phơi bày một số hành động hạn chế dưới dạng phương thức công khai. Giao diện cho một chiếc xe có thể bao gồm các phương pháp như accelerate(), deccelerate()/ brake(), setGear(), turnLeft(), turnRight()vv

Người lái xe không biết và cũng không nên quan tâm đến việc những hành động này được thực hiện bởi những người bên trong xe và cho thấy chức năng đó có thể gây nguy hiểm cho người lái xe và những người khác trên đường. Do đó, việc thực hành tốt việc thiết kế giao diện công cộng và đóng gói dữ liệu đằng sau giao diện đó.

Cách tiếp cận này cũng cho phép bạn thay đổi và cải thiện việc triển khai các phương thức công khai trong lớp của bạn mà không phá vỡ hợp đồng của giao diện với mã máy khách. Ví dụ, bạn có thể cải thiện accelerate()phương pháp để tiết kiệm nhiên liệu hơn, tuy nhiên việc sử dụng phương pháp đó sẽ vẫn như cũ; mã khách hàng sẽ không yêu cầu thay đổi nhưng vẫn gặt hái được lợi ích từ việc cải thiện hiệu quả của bạn.

Chỉnh sửa: Kể từ khi có vẻ như bạn vẫn đang ở giữa của việc học khái niệm hướng đối tượng (trong đó có nhiều khó khăn để làm chủ hơn cú pháp bất kỳ ngôn ngữ), tôi rất khuyên bạn nên chọn lên một bản sao của PHP Objects, Patterns, và thực hành bởi Matt Zandstra. Đây là cuốn sách đầu tiên dạy tôi cách sử dụng OOP hiệu quả, thay vì chỉ dạy tôi cú pháp. Tôi đã học cú pháp nhiều năm trước, nhưng điều đó là vô ích mà không hiểu "lý do" của OOP.


3
Cuốn sách được đề nghị trong phần chỉnh sửa của bài này thực sự rất xuất sắc. Đoạn tôi cho đến nay đã tỏ ra khá giác ngộ. Một vài chương đầu đã trả lời hầu hết các câu hỏi liên quan đến lớp học của tôi.
Giô

Những cuốn sách cho phép tôi thực sự hiểu các đối tượng, mà không làm lu mờ suy nghĩ của tôi với những chi tiết không cần thiết, như ví dụ trong Smalltalk, là của David A Taylor, là Công nghệ hướng đối tượng: Hướng dẫnKỹ thuật kinh doanh của Quản lý với Công nghệ đối tượng . Cả hai chỉ có 100 trang, và mỗi trang đủ dễ đọc trong một buổi chiều. Tất nhiên, có Mẫu thiết kế của Gamma et al , mặc dù cách tiếp cận cơ bản có thể được mô tả đơn giản bằng 'lớp con những gì bạn muốn thay đổi'.
Patanjali

Một sự tương tự rất tốt đẹp. Bạn có một cái để bảo vệ vs riêng tư?
Jāni Elmeris

79

private - chỉ có thể được truy cập từ FORIN trong lớp

protected - có thể được truy cập từ TRONG VÀO các lớp và INHERITING

public - cũng có thể được truy cập từ mã BÊN NGOÀI lớp

Điều này áp dụng cho các chức năng cũng như các biến.


Không chắc chắn nếu định nghĩa được bảo vệ là chính xác ở đây, từ câu trả lời được chọn thực tế có vẻ như được bảo vệ - Chỉ có thể được truy cập từ lớp kế thừa trở đi và không phải từ lớp gốc / lớp cha. Nói "TRONG lớp" có thể hơi khó hiểu.
pal4life

7
Tôi không nghĩ vậy, thực tế có vẻ như câu trả lời được chọn là câu trả lời khó hiểu ở đây. Xem bình luận của Shahids. IMHO một phương thức được bảo vệ rất có thể được truy cập từ bên trong lớp gốc.
Olaf

một lớp có thể truy cập công khai của lớp khác không?
Serjas

1
@Serjas: Không, chỉ các đối tượng khác, trừ khi chúng là các phương thức / trường tĩnh.
DanMan

Tôi không biết điều này có áp dụng cho tất cả các ngôn ngữ lập trình hay không, nhưng trong các thuộc tính / phương thức "được bảo vệ" của PHP có thể được truy cập trong cả lớp mà nó đã được khai báo hoặc các lớp kế thừa từ lớp định nghĩa thuộc tính / phương thức.
John Slegers

25

Sự khác biệt như sau:

Public :: Một biến công khai hoặc phương thức có thể được truy cập trực tiếp bởi bất kỳ người dùng nào của lớp.

Protected :: Một biến hoặc phương thức được bảo vệ không thể được truy cập bởi người dùng của lớp nhưng có thể được truy cập bên trong một lớp con kế thừa từ lớp.

Private :: Một biến hoặc phương thức riêng tư chỉ có thể được truy cập bên trong từ lớp được định nghĩa. Điều này có nghĩa là một biến hoặc phương thức riêng không thể được gọi từ một đứa trẻ mở rộng lớp.


17

Phạm vi hiển thị với các ví dụ trừu tượng :: Làm cho dễ hiểu

Khả năng hiển thị của một thuộc tính hoặc phương thức được xác định bằng cách khai báo trước khi sửa một trong ba từ khóa (Công khai, được bảo vệ và riêng tư)

Công khai : Nếu một thuộc tính hoặc phương thức được định nghĩa là công khai, điều đó có nghĩa là nó có thể được truy cập và thao tác bởi bất kỳ thứ gì có thể tham chiếu đến đối tượng.

  • Tóm tắt, vd. Hãy nghĩ phạm vi hiển thị công khai là "dã ngoại công cộng" mà bất kỳ ai cũng có thể đến.

Được bảo vệ: khi khả năng hiển thị thuộc tính hoặc phương thức được đặt thành các thành viên được bảo vệ chỉ có thể được truy cập trong chính lớp đó và bởi các lớp được kế thừa và kế thừa. (Kế thừa: - một lớp có thể có tất cả các thuộc tính và phương thức của lớp khác).

  • Hãy suy nghĩ như một phạm vi tầm nhìn được bảo vệ là "Công ty dã ngoại" nơi các thành viên công ty và thành viên gia đình của họ không được phép công khai. Đó là hạn chế phạm vi phổ biến nhất.

Riêng tư: Khi khả năng hiển thị của một thuộc tính hoặc phương thức được đặt thành riêng tư, chỉ có lớp có các thành viên riêng mới có thể truy cập các phương thức và thuộc tính đó (Bên trong lớp), bất kể có liên quan đến lớp nào.

  • với sự tương tự dã ngoại nghĩ như một "buổi dã ngoại của công ty, nơi chỉ các thành viên của công ty được phép" trong buổi dã ngoại. không gia đình không chung chung được phép.

15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

Trích từ :

http://php.net/manual/en/lingu.oop5.visibility.php


12

⚡️ Dưới đây là một cách dễ dàng để nhớ phạm vi public, protectedprivate.

PUBLIC:

  • public scope: Một biến / hàm công khai có sẵn cho cả các đối tượng và các lớp khác.

PROTECTED:

  • protected scope: Một biến / hàm được bảo vệ có sẵn cho tất cả các lớp mở rộng lớp hiện tại.
  • Không! Đối tượng không thể truy cập phạm vi này

PRIVATE:

  • private scope: Một biến / hàm riêng chỉ hiển thị trong lớp hiện tại nơi nó đang được định nghĩa.
  • Không! Lớp mở rộng lớp hiện tại không thể truy cập phạm vi này.
  • Không! Đối tượng không thể truy cập phạm vi này.

Đọc Khả năng hiển thị của một phương thức hoặc biến trên Sổ tay PHP.


9

Xem xét ' khi nào ':
Tôi có xu hướng tuyên bố mọi thứ là riêng tư ban đầu, nếu tôi không chắc chắn chính xác. Lý do là, việc biến một phương thức riêng tư thành công khai dễ dàng hơn nhiều so với cách khác. Đó là bởi vì ít nhất bạn có thể chắc chắn rằng phương thức riêng tư đã không được sử dụng ở bất cứ đâu ngoài chính lớp đó. Một phương thức công khai có thể đã được sử dụng ở mọi nơi, có thể yêu cầu viết lại rộng rãi.

Cập nhật : protectedngày nay tôi mặc định là vì tôi thấy rằng nó đủ tốt để đóng gói và không cản trở khi tôi mở rộng các lớp học (điều mà tôi cố gắng tránh bằng mọi cách). Chỉ khi tôi có một lý do tốt để sử dụng hai người kia, tôi sẽ.

Một lý do chính đáng cho một privatephương thức sẽ là một lý do thực hiện một cái gì đó vốn có cho đối tượng đó mà ngay cả một lớp mở rộng cũng không nên thay đổi (lý do thực tế, ngoài việc đóng gói, như quản lý nhà nước nội bộ). Cuối cùng, nó vẫn đủ dễ dàng để theo dõi nơi một protectedphương thức đang được sử dụng thường xuyên, vì vậy tôi mặc định cho đến protectedngày nay. Có lẽ không phải 100% khách quan "trong chiến hào", tôi thừa nhận.


3
Với bản cập nhật của bạn: Bạn có thể nói rõ hơn "đủ tốt" và "lý do chính đáng" đi cùng nhau ở đây như thế nào không? Ví dụ: sử dụng privatesẽ vẫn "đủ tốt" để sử dụng, nhưng bạn không đề xuất rằng mặc dù các lý do trước đó bạn đưa ra có vẻ như là "lý do chính đáng" vẫn còn: đóng gói.
hakre

@hakre: Lý do tại sao chúng ta phải cố gắng đóng gói là để tránh tình trạng rò rỉ ra phạm vi bên ngoài. protectedđã làm điều đó rồi, nhưng bạn giữ cho nó linh hoạt để gia hạn / kế thừa. Một lần nữa, trừ khi bạn có một lý do tốt để làm cho nó private.
Danman

Vâng, đó có lẽ là điểm chúng tôi không đồng ý: protectedthực sự rò rỉ ra phạm vi bên ngoài và thường theo cách của bạn vì nó hỗ trợ các quyết định thiết kế tồi như ngầm ủng hộ thừa kế trong khi tốt hơn là ưu tiên sáng tác. Đó là lý do tại sao gắn bó với riêng tư trừ khi bạn không có yêu cầu thực tế thường là cách tốt hơn để bắt đầu viết mã. Điều này cũng sẽ ngăn cản việc đưa ra quyết định thiết kế quá sớm trong khi chúng thực sự chưa cần thiết.
hakre

Tôi sẽ không tranh luận với quan điểm chung của bạn, bởi vì nó đủ công bằng, nhưng protectedkhông rò rỉ ra phạm vi bên ngoài (mã đang gọi / truy cập phương thức / trường) mà chỉ phạm vi bên trong (mở rộng các lớp). Có một sự khác biệt, nhỏ như nó có thể là với bạn. Việc theo dõi việc sử dụng một protectedlĩnh vực dễ dàng hơn nhiều so với một lĩnh vực public.
DanMan

6

Hướng dẫn sử dụng PHP có một đọc tốt về câu hỏi ở đây .

Khả năng hiển thị của một thuộc tính hoặc phương thức có thể được xác định bằng cách thêm tiền tố vào khai báo với các từ khóa công khai, được bảo vệ hoặc riêng tư. Các thành viên lớp tuyên bố công khai có thể được truy cập ở khắp mọi nơi. Các thành viên được tuyên bố bảo vệ chỉ có thể được truy cập trong chính lớp đó và bởi các lớp cha và lớp kế thừa. Các thành viên được khai báo là riêng tư chỉ có thể được truy cập bởi lớp xác định thành viên.


6

Đối với tôi, đây là cách hữu ích nhất để hiểu ba loại tài sản:

Công khai : Sử dụng điều này khi bạn ổn với biến này được truy cập trực tiếp và thay đổi từ bất kỳ đâu trong mã của bạn.

Ví dụ sử dụng từ bên ngoài lớp:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

Được bảo vệ : Sử dụng điều này khi bạn muốn buộc các lập trình viên khác (và chính bạn) sử dụng getters / setters bên ngoài lớp khi truy cập và thiết lập các biến (nhưng bạn cũng nên nhất quán và sử dụng getters và setters bên trong lớp). Đây hoặc privatecó xu hướng là cách mặc định mà bạn nên thiết lập tất cả các thuộc tính lớp.

Tại sao? Bởi vì nếu bạn quyết định tại một thời điểm nào đó trong tương lai (thậm chí chỉ trong 5 phút) rằng bạn muốn thao túng giá trị được trả lại cho tài sản đó hoặc làm gì đó với nó trước khi nhận / cài đặt, bạn có thể làm điều đó mà không cần cấu trúc lại mọi nơi bạn có đã sử dụng nó trong dự án của bạn.

Ví dụ sử dụng từ bên ngoài lớp:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

Riêng tư : privatethuộc tính rất giống với protectedtài sản. Nhưng đặc điểm / sự khác biệt là làm cho nó privatecũng làm cho nó không thể truy cập được vào các lớp con mà không sử dụng getter hoặc setter của lớp cha.

Về cơ bản, nếu bạn đang sử dụng getters và setters cho một thuộc tính (hoặc nếu nó chỉ được sử dụng bên trong bởi lớp cha và nó không có nghĩa là có thể truy cập được ở bất cứ nơi nào khác), bạn cũng có thể tạo ra nó private, chỉ để ngăn chặn bất kỳ ai thử để sử dụng nó trực tiếp và giới thiệu lỗi .

Ví dụ sử dụng bên trong một lớp con (mở rộng MyObject):

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();


4

Các biến trong PHP được đúc theo ba loại khác nhau:

Công khai: các giá trị của các loại biến này có sẵn trong mọi phạm vi và yêu cầu thực thi mã của bạn. tuyên bố như:public $examTimeTable;

Riêng tư: Các giá trị của loại biến này chỉ có sẵn cho lớp mà nó thuộc về. private $classRoomComputers;

Được bảo vệ: Các giá trị của lớp này chỉ và chỉ khả dụng khi Quyền truy cập được cấp dưới dạng thừa kế hoặc lớp con của chúng. thường được sử dụng ::để cấp quyền truy cập bởi lớp cha

protected $familyWealth;


3

Hồi sinh một câu hỏi cũ, nhưng tôi nghĩ rằng một cách thực sự tốt để nghĩ về điều này là về mặt API mà bạn đang xác định.

  • public - Mọi thứ được đánh dấu công khai là một phần của API mà bất kỳ ai sử dụng lớp / giao diện / khác của bạn sẽ sử dụng và dựa vào.

  • protected- Đừng để bị lừa, đây cũng là một phần của API! Mọi người có thể phân lớp, mở rộng mã của bạn và sử dụng bất cứ thứ gì được đánh dấu bảo vệ.

  • private- Các thuộc tính và phương thức riêng tư có thể được thay đổi bao nhiêu tùy thích. Không ai khác có thể sử dụng những thứ này. Đây là những điều duy nhất bạn có thể thay đổi mà không thực hiện thay đổi.

Hoặc theo thuật ngữ Semver :

  • Thay đổi bất cứ điều gì publichoặc protectednên được coi là thay đổi CHÍNH.

  • Bất cứ điều gì mới publichoặc protectednên (ít nhất) MINOR

  • Chỉ mới / thay đổi đối với bất cứ điều gì privatecó thể là VÒI

Vì vậy, về mặt duy trì mã, bạn nên cẩn thận với những gì bạn tạo ra publichoặc protectedbởi vì đây là những điều bạn đang hứa với người dùng của mình.


1

Khi chúng ta theo php hướng đối tượng trong dự án của chúng ta, chúng ta nên tuân theo một số quy tắc để sử dụng các sửa đổi truy cập trong php. Hôm nay chúng ta sẽ tìm hiểu rõ ràng công cụ sửa đổi truy cập là gì và làm thế nào chúng ta có thể sử dụng nó. Công cụ sửa đổi truy cập PHP được sử dụng để đặt quyền truy cập với các lớp PHP và các thành viên của chúng là các hàm và biến được định nghĩa trong phạm vi lớp. Trong php có ba phạm vi cho các thành viên lớp.

  1. CÔNG CỘNG
  2. RIÊNG TƯ
  3. BẢO VỆ

Bây giờ, chúng ta hãy xem hình ảnh sau đây để hiểu mức độ truy cập của công cụ sửa đổi truy cập nhập mô tả hình ảnh ở đây

Bây giờ, chúng ta hãy xem danh sách sau đây để biết về các từ khóa PHP có thể được sử dụng làm công cụ sửa đổi truy cập.

công khai: - lớp hoặc các thành viên của nó được xác định bằng công cụ sửa đổi truy cập này sẽ có thể truy cập công khai từ mọi nơi, thậm chí từ bên ngoài phạm vi của lớp.

private: - các thành viên lớp với từ khóa này sẽ được truy cập trong chính lớp đó. chúng ta không thể truy cập dữ liệu riêng tư từ lớp con. Nó bảo vệ các thành viên khỏi truy cập bên ngoài lớp.

được bảo vệ: - giống như riêng tư, ngoại trừ bằng cách cho phép các lớp con truy cập các thành viên siêu lớp được bảo vệ.

Bây giờ hãy xem bảng để hiểu công cụ sửa đổi truy cập Đọc toàn bộ bài viết Điều chỉnh truy cập php


1

Public: là trạng thái mặc định khi bạn khai báo một biến hoặc phương thức, có thể được truy cập bởi bất kỳ thứ gì trực tiếp đến đối tượng.

Protected: Chỉ có thể được truy cập trong phạm vi đối tượng và các lớp con.

Private: Chỉ có thể được tham chiếu trong đối tượng, không phải lớp con.


0

Các từ khóa được đề cập là các sửa đổi truy cập và giúp chúng tôi thực hiện Đóng gói (hoặc ẩn thông tin). Chúng báo cho trình biên dịch những lớp khác sẽ có quyền truy cập vào trường hoặc phương thức được định nghĩa.

riêng tư - Chỉ có lớp hiện tại mới có quyền truy cập vào trường hoặc phương thức.

được bảo vệ - Chỉ các lớp hiện tại và các lớp con (và đôi khi cũng là các lớp cùng gói) của lớp này mới có quyền truy cập vào trường hoặc phương thức.

công khai - Bất kỳ lớp nào cũng có thể tham khảo trường hoặc gọi phương thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.