27
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tại sao trong PHP, bạn có thể truy cập phương thức tĩnh thông qua thể hiện của một số lớp nhưng không chỉ thông qua tên loại?
Cập nhật: Tôi là nhà phát triển .NET nhưng tôi cũng làm việc với các nhà phát triển PHP. Gần đây tôi đã tìm thấy khoảnh khắc này về các phương thức tĩnh được gọi từ ví dụ và không thể hiểu tại sao nó có thể hữu ích.
EXAMPLE:
class Foo
{
public static Bar[]
{
}
}
Chúng ta có thể chấp nhận phương pháp như thế này:
var $foo = new Foo[];
$foo.Bar[]; // ??????
Matthew Lock
12.5K11 Huy hiệu vàng89 Huy hiệu bạc128 Huy hiệu đồng11 gold badges89 silver badges128 bronze badges
hỏi ngày 9 tháng 2 năm 2012 lúc 7:09Feb 9, 2012 at 7:09
3
Trong PHP
Lớp được khởi tạo bằng cách sử dụng từ khóa mới chẳng hạn;
var $foo = new Foo[];
$foo.Bar[]; // ??????
1và phương thức tĩnh hoặc thuộc tính có thể được truy cập bằng cách sử dụng toán tử phân giải phạm vi hoặc toán tử tham chiếu đối tượng. Ví dụ: nếu lớp
var $foo = new Foo[];
$foo.Bar[]; // ??????
2 chứa phương thức tĩnh var $foo = new Foo[];
$foo.Bar[]; // ??????
3 thì bạn có thể truy cập nó bằng cách nào đó.$MyClass->Foo[];
Hoặc
MyClass::Foo[]
Quy tắc duy nhất là các phương thức hoặc thuộc tính tĩnh nằm ngoài bối cảnh đối tượng. Ví dụ: bạn không thể sử dụng
var $foo = new Foo[];
$foo.Bar[]; // ??????
4 bên trong một phương thức tĩnh.
wp78de
17.6K6 Huy hiệu vàng38 Huy hiệu bạc68 Huy hiệu Đồng6 gold badges38 silver badges68 bronze badges
Đã trả lời ngày 9 tháng 2 năm 2012 lúc 7:12Feb 9, 2012 at 7:12
3
Class Do {
static public function test[] {
return 0;
}
}
Sử dụng như thế này:
echo Do::test[];
Milap
6.5898 Huy hiệu vàng25 Huy hiệu bạc45 Huy hiệu Đồng8 gold badges25 silver badges45 bronze badges
Đã trả lời ngày 14 tháng 12 năm 2016 lúc 16:32Dec 14, 2016 at 16:32
Afkirsaid afkir nóiSaid Afkir
Huy hiệu Silver Silver5 Huy hiệu Đồng1 silver badge5 bronze badges
Tại sao trong PHP, bạn có thể truy cập phương thức tĩnh thông qua thể hiện của một số lớp nhưng không chỉ thông qua tên loại?
Không giống như những gì bạn có thể đã quen với .NET, PHP có các loại động. Xem xét:
class Foo
{
static public function staticMethod[] { }
}
class Bar
{
static public function staticMethod[] { }
}
function doSomething[$obj]
{
// What type is $obj? We don't care.
$obj->staticMethod[];
}
doSomething[new Foo[]];
doSomething[new Bar[]];
Vì vậy, bằng cách cho phép truy cập vào các phương thức tĩnh thông qua thể hiện đối tượng, bạn có thể dễ dàng gọi hàm tĩnh của cùng tên trên các loại khác nhau.
Bây giờ tôi không biết nếu có một lý do chính đáng tại sao truy cập phương thức tĩnh thông qua
var $foo = new Foo[];
$foo.Bar[]; // ??????
5 được phép. PHP [5.3?] Cũng hỗ trợ:$obj::staticMethod[];
mà có lẽ ít khó hiểu hơn. Khi sử dụng
var $foo = new Foo[];
$foo.Bar[]; // ??????
6, nó phải là một hàm tĩnh để tránh các cảnh báo [không giống như var $foo = new Foo[];
$foo.Bar[]; // ??????
5, cũng cho phép].Đã trả lời ngày 9 tháng 2 năm 2012 lúc 8:28Feb 9, 2012 at 8:28
MatthewmatthewMatthew
46.8K11 Huy hiệu vàng85 Huy hiệu bạc97 Huy hiệu đồng11 gold badges85 silver badges97 bronze badges
5
Trong PHP, trong khi bạn được phép truy cập phương thức tĩnh bằng cách tham khảo một thể hiện của lớp, bạn không nhất thiết phải làm như vậy. Ví dụ: đây là một lớp có chức năng tĩnh:
class MyClass{
public static function MyFunction[$param]{
$mynumber=param*2;
return $mynumber;
}
Bạn có thể truy cập phương thức tĩnh chỉ bằng tên loại như thế này, nhưng trong trường hợp này, bạn phải sử dụng dấu hai chấm [: :], thay vì "->".
$result= MyClass::MyFunction[2];
[Xin lưu ý rằng bạn cũng có thể truy cập phương thức tĩnh thông qua một thể hiện của lớp cũng bằng cách sử dụng "->"]. Để biết thêm thông tin: //php.net/manual/en/langage.oop5.static.php
Đã trả lời ngày 12 tháng 3 năm 2018 lúc 20:40Mar 12, 2018 at 20:40
Đôi khi, nó rất hữu ích nếu chúng ta có thể truy cập các phương thức và thuộc tính trong bối cảnh của một lớp chứ không phải là một đối tượng. Để làm điều này, bạn có thể sử dụng từ khóa tĩnh. Vì vậy, chúng ta có thể truy cập phương thức tĩnh bằng cách sử dụng tên lớp cùng với độ phân giải phạm vi.
var $foo = new Foo[];
$foo.Bar[]; // ??????
0Nhìn ở đây chúng tôi đã tuyên bố một phương thức tĩnh trong lớp người dùng của chúng tôi. Vì vậy, nếu chúng tôi khai báo một phương thức tĩnh thì chúng tôi có thể truy cập ở đó chỉ bằng tên lớp. Không cần tạo đối tượng để truy cập ở đó. Hy vọng bạn sẽ hiểu tất cả các thủ tục.
Lưu ý: Đây thực sự là sự khác biệt chính với một phương pháp bình thường: $ Điều này không có sẵn trong các phương pháp như vậy.
Đọc toàn bộ bài viết từ đây làm thế nào để sử dụng các thuộc tính tĩnh trong PHP?
Ehsan
12.3k3 Huy hiệu vàng23 Huy hiệu bạc43 Huy hiệu đồng3 gold badges23 silver badges43 bronze badges
Đã trả lời ngày 20 tháng 1 năm 2019 lúc 16:59Jan 20, 2019 at 16:59
Trong Php 7, dường như bạn hoàn toàn cần thiết cho bạn để có thể làm
var $foo = new Foo[];
$foo.Bar[]; // ??????
8. Bởi vì, nếu mã này được viết trong một lớp trừu tượng và var $foo = new Foo[];
$foo.Bar[]; // ??????
9 cũng là trừu tượng trong lớp trừu tượng của bạn, $MyClass->Foo[];
0 và $MyClass->Foo[];
1 mang lại kết quả khác nhau!Khi thực hiện
var $foo = new Foo[];
$foo.Bar[]; // ??????
8 từ một đứa trẻ [không phải là người] của lớp trừu tượng, bạn sẽ kết thúc trong $MyClass->Foo[];
3. Tất cả đều tốt.Tuy nhiên, việc thực hiện
$MyClass->Foo[];
4 từ một đứa trẻ [không phải là của lớp trừu tượng, bạn kết thúc trong $MyClass->Foo[];
5, là trừu tượng và do đó ném một ngoại lệ.Tôi đoán đây chỉ là một ví dụ khác về PHP được thiết kế xấu. Hoặc bản thân tôi cần nhiều cà phê hơn ...
Đã trả lời ngày 24 tháng 8 năm 2018 lúc 14:04Aug 24, 2018 at 14:04
1