Tôi đang học những thứ OO, và tình cờ gặp phải điều này:
class n{
private function f[$v]{
return $v*7;
}
function c[]{
return $this->f[5];
}
}
$o = new n;
echo $o->c[]; //returns 35
Không phải điều đó đánh bại mục đích khai báo các chức năng private
nếu tôi có thể truy cập nó từ bên ngoài lớp? Điều này không nên bị chặn hoàn toàn? Tui bỏ lỡ điều gì vậy? Vui lòng giúp dọn dẹp. Cảm ơn
Hồi giáo Ariful
7.5637 Huy hiệu vàng34 Huy hiệu bạc54 Huy hiệu đồng7 gold badges34 silver badges54 bronze badges
Đã hỏi ngày 15 tháng 11 năm 2011 lúc 8:49Nov 15, 2011 at 8:49
1
Các chức năng công cộng có nghĩa là để thực hiện các hoạt động trên một ví dụ của lớp đó. Nói, Save[]
.
Hoạt động nội bộ của Save[]
không thú vị đối với người gọi; Anh ta chỉ đơn giản muốn cứu nó và không quan tâm làm thế nào điều đó xảy ra.
Như một vấn đề của phong cách, bạn có thể hoặc không muốn thực sự thực hiện việc tiết kiệm trong phương pháp đó. Nó có thể phụ thuộc vào các lựa chọn thiết kế, hoặc vào các thuộc tính của đối tượng. Nhìn thấy:
class FooObject
{
private $_source;
public function Save[]
{
if [$this->_source == "textfile"]
{
$this->saveToTextfile[];
}
elseif [$this->_source == "database"]
{
$this->saveToDatabase[];
}
}
private function saveToTextfile[]
{
// Magic
}
private function saveToDatabase[]
{
// Magic
}
}
Bạn không muốn bất cứ ai gọi trực tiếp các phương thức riêng tư, vì chúng chỉ sử dụng nội bộ. Tuy nhiên, một phương thức công khai có thể gián tiếp gọi một phương thức riêng tư.
Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:55Nov 15, 2011 at 8:55
CodecasterCodecasterCodeCaster
Phù vàng 143K22 Huy hiệu vàng211 Huy hiệu đồng22 gold badges211 silver badges259 bronze badges
0
Bạn đã bỏ lỡ điểm, rằng bạn không gọi phương thức private
từ bên ngoài. Bạn gọi phương thức public
[thiếu điều chỉnh khả năng hiển thị = public
] từ bên ngoài và từ đó bạn gọi phương thức private
từ bên trong lớp.
Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:52Nov 15, 2011 at 8:52
KingcrunchKingCrunchKingCrunch
127K20 Huy hiệu vàng147 Huy hiệu bạc171 Huy hiệu đồng20 gold badges147 silver badges171 bronze badges
Tuyên bố mọi thứ private
chỉ giấu chúng khỏi giao diện công cộng. Bạn hoàn toàn có quyền làm những việc như trong đoạn mã của bạn; tức là thực hiện giao diện công cộng theo các phương thức nội bộ riêng tư "ẩn".
Nếu bạn đang viết một thư viện, có lẽ bạn sẽ để lại giao diện công cộng của mình được xác định rõ ràng và cố gắng giảm thiểu các thay đổi giữa các bản phát hành [để người dùng không phải duy trì mã của họ]. Nhưng bạn sẽ được tự do sửa đổi các công cụ nội bộ theo bất kỳ cách nào bạn thích, mà không phải trả giá cho người dùng.
Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:51Nov 15, 2011 at 8:51
Bạn không thể gọi chức năng của mình ngay cả từ mã của mình, bạn gọi
$this->f[5];
thông qua một cuộc gọi đến
c[]
Bạn sẽ không thể gọi f [] với một tham số khác, ít nhất là trong mã bạn đã đăng.
Nhưng không, gọi các phương thức riêng tư từ các phương pháp công cộng không phải là mùi mã.code smell.
Ý tôi là, nơi nào khác bạn sẽ mong đợi chúng được gọi từ nếu không phải từ các phương thức công cộng?
Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:53Nov 15, 2011 at 8:53
Luchian Grigoreluchian GrigoreLuchian Grigore
249K63 Huy hiệu vàng448 Huy hiệu bạc615 Huy hiệu Đồng63 gold badges448 silver badges615 bronze badges
Phương pháp private
có nghĩa là nó làm những thứ bên trong không liên quan đến thế giới bên ngoài [bên ngoài lớp].
Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:54Nov 15, 2011 at 8:54
Samurasamurasamura
4.3651 Huy hiệu vàng18 Huy hiệu bạc26 Huy hiệu đồng1 gold badge18 silver badges26 bronze badges
Bạn không thể gọi
class FooObject
{
private $_source;
public function Save[]
{
if [$this->_source == "textfile"]
{
$this->saveToTextfile[];
}
elseif [$this->_source == "database"]
{
$this->saveToDatabase[];
}
}
private function saveToTextfile[]
{
// Magic
}
private function saveToDatabase[]
{
// Magic
}
}
4 trực tiếp từ bên ngoài, tất cả là private
được cho là để bảo vệ. Nếu bạn không thể gọi phương thức private
nếu bất kỳ phương thức public
nào có liên quan ở bất cứ đâu trong ngăn xếp cuộc gọi, bạn không thể gọi nó là gì. Một số phương pháp của lớp học của bạn cần được gọi từ bên ngoài; và sau đó có thể thực hiện các cuộc gọi trong nội bộ.Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:55Nov 15, 2011 at 8:55
CodecasterCodecaster♦deceze
Phù vàng 143K22 Huy hiệu vàng211 Huy hiệu đồng81 gold badges720 silver badges867 bronze badges
Bạn đã bỏ lỡ điểm, rằng bạn không gọi phương thức private
từ bên ngoài. Bạn gọi phương thức public
[thiếu điều chỉnh khả năng hiển thị = public
] từ bên ngoài và từ đó bạn gọi phương thức private
từ bên trong lớp.
Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:52
KingcrunchKingCrunchNov 15, 2011 at 8:58
127K20 Huy hiệu vàng147 Huy hiệu bạc171 Huy hiệu đồngJoseph Woodward
Tuyên bố mọi thứ private
chỉ giấu chúng khỏi giao diện công cộng. Bạn hoàn toàn có quyền làm những việc như trong đoạn mã của bạn; tức là thực hiện giao diện công cộng theo các phương thức nội bộ riêng tư "ẩn".5 gold badges43 silver
badges62 bronze badges
Nếu bạn đang viết một thư viện, có lẽ bạn sẽ để lại giao diện công cộng của mình được xác định rõ ràng và cố gắng giảm thiểu các thay đổi giữa các bản phát hành [để người dùng không phải duy trì mã của họ]. Nhưng bạn sẽ được tự do sửa đổi các công cụ nội bộ theo bất kỳ cách nào bạn thích, mà không phải trả giá cho người dùng.Oct 28, 2017 at 11:48
Đã trả lời ngày 15 tháng 11 năm 2011 lúc 8:51
Bạn không thể gọi chức năng của mình ngay cả từ mã của mình, bạn gọiNov 15, 2011 at 9:00
ern0ern0ern0
thông qua một cuộc gọi đến25 silver badges35 bronze badges
1