PHP - กำหนดค่าคงที่ภายในคลาส


88

ฉันจะกำหนดค่าคงที่ภายในคลาสได้อย่างไรและกำหนดให้มองเห็นได้เฉพาะเมื่อเรียกในบริบทของคลาส

....สิ่งที่ต้องการ Foo::app()->MYCONSTANT;

(และถ้าเรียกเหมือนMYCONSTANTจะละเลย)


3
ฉันมีปัญหานี้เมื่อเร็ว ๆ นี้stackoverflow.com/q/5710676/560299
Ibu

คำตอบ:


141

ดูค่าคงที่ของคลาส :

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

ในกรณีนี้สะท้อนMYCONSTANTด้วยตัวเองจะยกแจ้งให้ทราบเกี่ยวกับค่าคงที่ไม่ได้กำหนดและการส่งออกอย่างต่อเนื่อง"MYCONSTANT"ชื่อแปลงสตริง:


แก้ไข - บางทีสิ่งที่คุณกำลังมองหาคือคุณสมบัติ / ตัวแปรคงที่ :

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"

แต่มันใช้ไม่ได้ที่จะกำหนดไว้ในฟังก์ชันของคลาส :(
อเล็กซ์

@ อเล็กซ์: ไม่มันไม่ (AFAIK อาจมีวิธีที่คลุมเครือ)
Alix Axel

3
(is_null(self::$staticVariable) === true) && (isset($value) === true)จะรวบรัดกว่ามากเช่นself::$staticVariable === null && $value !== nullกัน $valueมักจะตั้งissetอยู่ภายในการทำงานจึงไม่จำเป็นต้องใช้ไม่ได้ และไฮเปอร์โจ่งแจ้ง=== trueไม่ได้เพิ่มอะไรเลย
หลอกลวง

1
เราเคยคุยกันมาก่อนหรือเปล่า? ช่วยไม่ได้ฉันแค่ไม่ชอบสไตล์นั้นจริงๆ ;-D
หลอกลวง

@deceze: ใช่ ฉันคุ้นเคยกับสไตล์นี้มากและใช้ได้กับฉันดังนั้นฉันจะยึดติดกับมัน แต่คุณก็พูดถูกเช่นกัน =)
Alix Axel

24

นี่เป็นคำถามเก่า แต่ตอนนี้ใน PHP 7.1 คุณสามารถกำหนดการมองเห็นคงที่ได้

ตัวอย่าง

<?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;
?>

ผลลัพธ์ของตัวอย่างข้างต้นใน PHP 7.1:

บาร์

ข้อผิดพลาดร้ายแรง: Uncaught Error: ไม่สามารถเข้าถึง const ส่วนตัว Foo :: BAZ ใน ...

หมายเหตุ: เนื่องจากตัวปรับการมองเห็นของ PHP 7.1.0 อนุญาตให้ใช้ค่าคงที่ของคลาสได้

ข้อมูลเพิ่มเติมที่นี่


11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

วิธีนี้เป็นวิธีเดียวที่จะทำให้ค่าคงที่ระดับ ค่าคงที่เหล่านี้มักจะทั่วโลกสามารถเข้าถึงได้ผ่านแต่พวกเขาไม่สามารถเข้าถึงได้ผ่านเพียงFoo::BARBAR

เพื่อให้บรรลุไวยากรณ์เหมือนFoo::baz()->BARคุณจะต้องกลับวัตถุจากฟังก์ชั่นbaz()ของการเรียนFooที่มีคุณสมบัติ BARนั่นไม่ใช่ค่าคงที่ ใด ๆคงที่คุณกำหนดอยู่เสมอทั่วโลกสามารถเข้าถึงได้จากทุกที่และไม่สามารถ จำกัด ผลการเรียกใช้ฟังก์ชัน


6

นี่เป็นคำถามที่ค่อนข้างเก่า แต่บางทีคำตอบนี้ยังสามารถช่วยคนอื่นได้

คุณสามารถจำลองค่าคงที่สาธารณะที่ถูก จำกัด ภายในขอบเขตคลาสโดยใช้คีย์เวิร์ดสุดท้ายกับวิธีการที่ส่งคืนค่าที่กำหนดไว้ล่วงหน้าเช่น

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

คีย์เวิร์ดสุดท้ายของเมธอดป้องกันไม่ให้คลาสขยายกำหนดเมธอดใหม่ คุณยังสามารถวางคีย์เวิร์ดสุดท้ายไว้หน้าการประกาศคลาสซึ่งในกรณีนี้คีย์เวิร์ดจะป้องกันการสืบทอดคลาส

เพื่อให้ได้เกือบทุกสิ่งที่อเล็กซ์กำลังมองหาสามารถใช้รหัสต่อไปนี้:

final class Constants {

    public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

class Foo {

    static public app()
    {
        return new Constants();
    }
}

ค่าคงที่ที่จำลองจะสามารถเข้าถึงได้ดังนี้:

Foo::app()->MYCONSTANT();

3

คุณสามารถกำหนดค่าคงที่ของคลาสใน php แต่ค่าคงที่คลาสของคุณก็สามารถเข้าถึงได้จากอินสแตนซ์วัตถุเช่นกัน นี่คือฟังก์ชันการทำงานของ php แต่เป็นของphp7.1คุณสามารถกำหนดค่าคงที่ระดับของคุณด้วยการปรับเปลี่ยนการเข้าถึง ( public, privateหรือprotected)

วิธีแก้ปัญหาคือการกำหนดค่าคงที่ของคุณเป็นprivateหรือprotectedแล้วทำให้สามารถอ่านได้โดยใช้ a static function. ฟังก์ชันนี้ควรส่งคืนค่าคงที่หากเรียกจากบริบทคงที่เท่านั้น

คุณยังสามารถสร้างฟังก์ชันคงที่นี้ในคลาสพาเรนต์ของคุณและเพียงแค่สืบทอดคลาสพาเรนต์นี้กับคลาสอื่น ๆ ทั้งหมดเพื่อให้เป็นฟังก์ชันเริ่มต้น

เครดิต: http://dwellupper.io/post/48/defining-class-constants-in-php

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.