Làm cách nào tôi có thể xác định một hằng số bên trong một lớp và làm cho nó để nó chỉ hiển thị khi được gọi trong ngữ cảnh lớp?
....cái gì đó như Foo::app()->MYCONSTANT;
(và nếu được gọi là muốn MYCONSTANT
được bỏ qua)
Làm cách nào tôi có thể xác định một hằng số bên trong một lớp và làm cho nó để nó chỉ hiển thị khi được gọi trong ngữ cảnh lớp?
....cái gì đó như Foo::app()->MYCONSTANT;
(và nếu được gọi là muốn MYCONSTANT
được bỏ qua)
Câu trả lời:
Xem Hằng số Lớp :
class MyClass
{
const MYCONSTANT = 'constant value';
function showConstant() {
echo self::MYCONSTANT. "\n";
}
}
echo MyClass::MYCONSTANT. "\n";
$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0
Trong trường hợp này lặp lại MYCONSTANT
bởi chính nó sẽ nâng cao một thông báo về một hằng số không xác định và sản lượng không đổi tên chuyển thành một chuỗi: "MYCONSTANT"
.
CHỈNH SỬA - Có lẽ những gì bạn đang tìm kiếm là các thuộc tính / biến tĩnh này :
class MyClass
{
private static $staticVariable = null;
public static function showStaticVariable($value = null)
{
if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
{
self::$staticVariable = $value;
}
return self::$staticVariable;
}
}
MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"
(is_null(self::$staticVariable) === true) && (isset($value) === true)
sẽ ngắn gọn hơn nhiều self::$staticVariable === null && $value !== null
. $value
sẽ luôn được đặt bên trong hàm, vì vậy không cần sử dụng isset
. Và siêu rõ ràng === true
không thêm bất cứ điều gì.
Đây là câu hỏi cũ, nhưng bây giờ trên PHP 7.1, bạn có thể xác định khả năng hiển thị liên tục.
THÍ DỤ
<?php
class Foo {
// As of PHP 7.1.0
public const BAR = 'bar';
private const BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>
Đầu ra của ví dụ trên trong PHP 7.1:
quán ba Lỗi nghiêm trọng: Lỗi chưa xảy ra: Không thể truy cập private const Foo :: BAZ trong…
Lưu ý: Kể từ PHP 7.1.0, các công cụ sửa đổi khả năng hiển thị được cho phép đối với các hằng số lớp.
Thông tin thêm tại đây
class Foo {
const BAR = 'baz';
}
echo Foo::BAR;
Đây là cách duy nhất để tạo hằng số lớp . Các hằng số này luôn có thể truy cập toàn cầu thông qua Foo::BAR
, nhưng chúng không thể truy cập chỉ qua BAR
.
Để đạt được cú pháp như vậy Foo::baz()->BAR
, bạn sẽ cần trả về một đối tượng từ hàm baz()
của lớp Foo
có thuộc tính BAR
. Đó không phải là một hằng số. Bất kỳ hằng số nào bạn xác định luôn có thể truy cập được trên toàn cầu từ mọi nơi và không thể bị giới hạn trong kết quả cuộc gọi hàm.
Đây là một câu hỏi khá cũ, nhưng có lẽ câu trả lời này vẫn có thể giúp ích cho người khác.
Bạn có thể mô phỏng một hằng số chung bị hạn chế trong phạm vi lớp bằng cách áp dụng từ khóa cuối cùng cho một phương thức trả về giá trị được xác định trước, như sau:
class Foo {
// This is a private constant
final public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
Từ khóa cuối cùng trên một phương thức ngăn một lớp mở rộng định nghĩa lại phương thức. Bạn cũng có thể đặt từ khóa cuối cùng trước phần khai báo lớp, trong trường hợp đó, từ khóa này sẽ ngăn cản Sự kế thừa của lớp.
Để có được gần như chính xác những gì Alex đang tìm kiếm, có thể sử dụng mã sau:
final class Constants {
public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
class Foo {
static public app()
{
return new Constants();
}
}
Giá trị hằng số được mô phỏng sẽ có thể truy cập được như thế này:
Foo::app()->MYCONSTANT();
Bạn có thể định nghĩa một hằng số lớp trong php. Nhưng hằng số lớp của bạn cũng có thể truy cập được từ bất kỳ cá thể đối tượng nào. Đây là chức năng của php. Tuy nhiên, tính đến php7.1 , bạn có thể xác định các hằng số lớp học của bạn với bổ truy cập ( public
, private
hoặc protected
).
Một công việc xung quanh sẽ là xác định hằng số của bạn là private
hoặc protected
và sau đó làm cho chúng có thể đọc được thông qua a static function
. Hàm này chỉ nên trả về các giá trị không đổi nếu được gọi từ ngữ cảnh tĩnh.
Bạn cũng có thể tạo hàm tĩnh này trong lớp cha của mình và chỉ cần kế thừa lớp cha này trên tất cả các lớp khác để làm cho nó trở thành một chức năng mặc định.
Tín dụng: http://dwellupper.io/post/48/defining-class-constants-in-php