PHP - mendefinisikan konstanta di dalam kelas

88

Bagaimana saya bisa mendefinisikan konstanta di dalam kelas, dan membuatnya jadi hanya terlihat ketika dipanggil dalam konteks kelas?

....sesuatu seperti Foo::app()->MYCONSTANT;

(dan jika dipanggil suka MYCONSTANTdiabaikan)

Alex
sumber
3
Saya mengalami masalah ini baru-baru ini stackoverflow.com/q/5710676/560299
Ibu

Jawaban:

141

Lihat Konstanta Kelas :

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

Dalam hal ini bergema MYCONSTANTdengan sendirinya akan meningkatkan pemberitahuan tentang konstan terdefinisi dan output konstan nama dikonversi ke string: "MYCONSTANT".


EDIT - Mungkin yang Anda cari adalah properti / variabel statis ini :

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"
Alix Axel
sumber
tetapi tidak berhasil untuk mendefinisikannya di dalam fungsi kelas :(
Alex
@Alex: Tidak, tidak (AFAIK, mungkin ada cara yang tidak jelas).
Alix Axel
3
(is_null(self::$staticVariable) === true) && (isset($value) === true)akan jauh lebih ringkas seperti self::$staticVariable === null && $value !== null. $valueakan selalu disetel di dalam fungsi, jadi tidak perlu digunakan isset. Dan hiper-eksplisit === truetidak menambahkan apa pun.
menipu
1
Apakah kita pernah melakukan percakapan ini sebelumnya? Tidak dapat menahannya, saya hanya sangat tidak menyukai gaya itu. ;-D
menipu
@deceze: Ya. Saya sangat terbiasa dengan gaya ini dan itu berhasil untuk saya jadi saya akan tetap menggunakannya, tetapi Anda juga benar. =)
Alix Axel
24

Ini dan pertanyaan lama, tapi sekarang di PHP 7.1 Anda dapat mendefinisikan visibilitas konstan.

CONTOH

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

Output dari contoh di atas dalam PHP 7.1:

batang

Kesalahan fatal: Kesalahan Tidak Tertangkap: Tidak dapat mengakses const pribadi Foo :: BAZ di…

Catatan: Mulai PHP 7.1.0, pengubah visibilitas diizinkan untuk konstanta kelas.

Info selengkapnya di sini

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

echo Foo::BAR;

Ini adalah satu-satunya cara untuk membuat konstanta kelas . Konstanta ini selalu dapat diakses secara global melalui Foo::BAR, tetapi tidak dapat diakses hanya melalui BAR.

Untuk mencapai sintaks seperti ini Foo::baz()->BAR, Anda perlu mengembalikan objek dari fungsi baz()kelas Fooyang memiliki properti BAR . Itu tidak konstan. Setiap konstan Anda mendefinisikan selalu global dapat diakses dari mana saja dan tidak dapat dibatasi untuk hasil fungsi panggilan.

menipu
sumber
6

Ini pertanyaan yang cukup lama, tapi mungkin jawaban ini masih bisa membantu orang lain.

Anda dapat meniru konstanta publik yang dibatasi dalam ruang lingkup kelas dengan menerapkan kata kunci terakhir ke metode yang mengembalikan nilai yang telah ditentukan sebelumnya, seperti ini:

class Foo {

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

Kata kunci terakhir pada sebuah metode mencegah kelas yang diperluas untuk mendefinisikan kembali metode tersebut. Anda juga dapat menempatkan kata kunci terakhir di depan deklarasi kelas, dalam hal ini kata kunci tersebut mencegah Warisan kelas.

Untuk mendapatkan hampir persis apa yang Alex cari, kode berikut dapat digunakan:

final class Constants {

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

class Foo {

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

Nilai konstanta yang diemulasi akan dapat diakses seperti ini:

Foo::app()->MYCONSTANT();
Wouter van Dam
sumber
3

Anda dapat mendefinisikan sebuah konstanta kelas di php. Tetapi konstanta kelas Anda juga dapat diakses dari instance objek apa pun. Ini adalah fungsi php. Namun, mulai dari php7.1 , Anda dapat mendefinisikan konstanta kelas Anda dengan pengubah akses ( public, privateatau protected).

Cara lainnya adalah dengan mendefinisikan konstanta Anda sebagai privateatau protecteddan kemudian membuatnya dapat dibaca melalui a static function. Fungsi ini seharusnya hanya mengembalikan nilai konstan jika dipanggil dari konteks statis.

Anda juga dapat membuat fungsi statis ini di kelas induk Anda dan hanya mewarisi kelas induk ini di semua kelas lain untuk menjadikannya fungsionalitas default.

Penghargaan: http://dwellupper.io/post/48/defining-class-constants-in-php

Pranav Rana
sumber