PHP - định nghĩa hằng số bên trong một lớp


88

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)


3
tôi đã gặp sự cố này gần đây stackoverflow.com/q/5710676/560299
Ibu

Câu trả lời:


140

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 MYCONSTANTbở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"

nhưng nó không hoạt động để xác định nó bên trong một hàm của lớp :(
Alex

@Alex: Không, không (AFAIK, có thể có một số cách khó hiểu).
Alix Axel

3
(is_null(self::$staticVariable) === true) && (isset($value) === true)sẽ ngắn gọn hơn nhiều self::$staticVariable === null && $value !== null. $valuesẽ 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 === truekhông thêm bất cứ điều gì.
dối trá

1
Chúng ta đã có cuộc trò chuyện này trước đây? Không thể giúp được, tôi chỉ thực sự không thích phong cách đó. ;-D
deceze

@deceze: Có. Tôi rất quen với phong cách này và nó phù hợp với tôi nên tôi sẽ gắn bó với nó, nhưng bạn cũng đúng. =)
Alix Axel

24

Đâ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


11
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 Foocó 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.


6

Đâ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();

3

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, privatehoặc protected).

Một công việc xung quanh sẽ là xác định hằng số của bạn là privatehoặc protectedvà 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

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.