ฉันจะกำหนดค่าคงที่ภายในคลาสได้อย่างไรและกำหนดให้มองเห็นได้เฉพาะเมื่อเรียกในบริบทของคลาส
....สิ่งที่ต้องการ Foo::app()->MYCONSTANT;
(และถ้าเรียกเหมือนMYCONSTANT
จะละเลย)
ฉันจะกำหนดค่าคงที่ภายในคลาสได้อย่างไรและกำหนดให้มองเห็นได้เฉพาะเมื่อเรียกในบริบทของคลาส
....สิ่งที่ต้องการ Foo::app()->MYCONSTANT;
(และถ้าเรียกเหมือนMYCONSTANT
จะละเลย)
คำตอบ:
ดูค่าคงที่ของคลาส :
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"
(is_null(self::$staticVariable) === true) && (isset($value) === true)
จะรวบรัดกว่ามากเช่นself::$staticVariable === null && $value !== null
กัน $value
มักจะตั้งisset
อยู่ภายในการทำงานจึงไม่จำเป็นต้องใช้ไม่ได้ และไฮเปอร์โจ่งแจ้ง=== true
ไม่ได้เพิ่มอะไรเลย
นี่เป็นคำถามเก่า แต่ตอนนี้ใน 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 อนุญาตให้ใช้ค่าคงที่ของคลาสได้
ข้อมูลเพิ่มเติมที่นี่
class Foo {
const BAR = 'baz';
}
echo Foo::BAR;
วิธีนี้เป็นวิธีเดียวที่จะทำให้ค่าคงที่ระดับ ค่าคงที่เหล่านี้มักจะทั่วโลกสามารถเข้าถึงได้ผ่านแต่พวกเขาไม่สามารถเข้าถึงได้ผ่านเพียงFoo::BAR
BAR
เพื่อให้บรรลุไวยากรณ์เหมือนFoo::baz()->BAR
คุณจะต้องกลับวัตถุจากฟังก์ชั่นbaz()
ของการเรียนFoo
ที่มีคุณสมบัติ BAR
นั่นไม่ใช่ค่าคงที่ ใด ๆคงที่คุณกำหนดอยู่เสมอทั่วโลกสามารถเข้าถึงได้จากทุกที่และไม่สามารถ จำกัด ผลการเรียกใช้ฟังก์ชัน
นี่เป็นคำถามที่ค่อนข้างเก่า แต่บางทีคำตอบนี้ยังสามารถช่วยคนอื่นได้
คุณสามารถจำลองค่าคงที่สาธารณะที่ถูก จำกัด ภายในขอบเขตคลาสโดยใช้คีย์เวิร์ดสุดท้ายกับวิธีการที่ส่งคืนค่าที่กำหนดไว้ล่วงหน้าเช่น
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();
คุณสามารถกำหนดค่าคงที่ของคลาสใน php แต่ค่าคงที่คลาสของคุณก็สามารถเข้าถึงได้จากอินสแตนซ์วัตถุเช่นกัน นี่คือฟังก์ชันการทำงานของ php แต่เป็นของphp7.1คุณสามารถกำหนดค่าคงที่ระดับของคุณด้วยการปรับเปลี่ยนการเข้าถึง ( public
, private
หรือprotected
)
วิธีแก้ปัญหาคือการกำหนดค่าคงที่ของคุณเป็นprivate
หรือprotected
แล้วทำให้สามารถอ่านได้โดยใช้ a static function
. ฟังก์ชันนี้ควรส่งคืนค่าคงที่หากเรียกจากบริบทคงที่เท่านั้น
คุณยังสามารถสร้างฟังก์ชันคงที่นี้ในคลาสพาเรนต์ของคุณและเพียงแค่สืบทอดคลาสพาเรนต์นี้กับคลาสอื่น ๆ ทั้งหมดเพื่อให้เป็นฟังก์ชันเริ่มต้น
เครดิต: http://dwellupper.io/post/48/defining-class-constants-in-php