PHP 7.2.0 Beta 3 Released

Sihirli Sabitler

PHP, çalışan her betiğin erişebileceği çok sayıda öntanımlı sabit'e sahiptir. Öte yandan, bu sabitlerin çoğu, çeşitli eklentiler tarafından tanımlandığından, sadece eklenti bir modül olarak veya PHP içinde derlenmişse kullanılabilir.

Değerleri kullanıldıkları yere göre değişen sekiz sihirli sabit vardır. Örneğin, __LINE__ sabitinin değeri betiğin hangi satırında kullanıldığına bağlıdır. Bu özel sabitler büyük-küçük harf farkına duyarsızdır ve aşağıda listelenmişlerdir:

Birkaç "sihirli" PHP sabiti
İsim Açıklama
__LINE__ Dosyada bu sabitin bulunduğu satırın numarası.
__FILE__ Dosyanın veya sembolik bağdan çözümlenen dosyanın tam dosya yolu ve dosya ismi. include işlevi ile betiğe eklenen bir dosyanın içinde kullanıldığında betiğin ismini değil, eklenen dosyanın ismini içerir.
__DIR__ Dosyanın bulurduğu dizin. Dahil edilen bir dosyanın içinde kullanıldığında dahil edilen dosyanın dizini döner. Bu dirname(__FILE__) işlevine eşdeğerder. Bu dizin isminin sonuna bir kök dizin olmadıkça bir bölü imi konmaz.
__FUNCTION__ İşlev ismi.
__CLASS__ Sınıf ismi. Bbildirildiği isim alanını (Foo\Bar gibi) içerir. PHP 5.4 ve sonrasında __CLASS__ ayrıca kalıtsal özelliklerin içinde de çalışır. Böyle bir yöntemin içinde kullanıldığında __CLASS__, kalıtsal özelliğin içinde kullanıldığı sınıfın ismidir.
__TRAIT__ Kalıtsal özellik ismi. Bildirildiği isim alanını (Foo\Bar gibi) içerir.
__METHOD__ Yöntem ismi.
__NAMESPACE__ Geçerli isim alanının adı.

Ayrıca bakınız: get_class(), get_object_vars(), file_exists() ve function_exists().

Sürüm Bilgisi

Sürüm: Açıklama
5.4.0 __TRAIT__ sabiti eklendi
5.3.0 __DIR__ ve __NAMESPACE__ sabitleri eklendi
5.0.0 __METHOD__ sabiti eklendi
5.0.0 Bu sürümden önce bazı sihirli sabitlerin değerleri daima küçük harfliydi. Şimdi bunların hepsi harf büyüklüğüne duyarlıdır (isimler bildirildikleri gibi içerilir).
4.3.0 __FUNCTION__ ve __CLASS__ sabitleri eklendi
4.0.2 __FILE__ daima sembolik bağları çözümlenmiş mutlak bir yol içerir, halbuki eski sürümlerde bazı durumlarda göreli yollar da içerirdi.

add a note add a note

User Contributed Notes 9 notes

up
180
vijaykoul_007 at rediffmail dot com
11 years ago
the difference between
__FUNCTION__ and __METHOD__ as in PHP 5.0.4 is that

__FUNCTION__ returns only the name of the function

while as __METHOD__ returns the name of the class alongwith the name of the function

class trick
{
      function doit()
      {
                echo __FUNCTION__;
      }
      function doitagain()
      {
                echo __METHOD__;
      }
}
$obj=new trick();
$obj->doit();
output will be ----  doit
$obj->doitagain();
output will be ----- trick::doitagain
up
12
Sbastien Fauvel
1 year ago
Note a small inconsistency when using __CLASS__ and __METHOD__ in traits (stand php 7.0.4): While __CLASS__ is working as advertized and returns dynamically the name of the class the trait is being used in, __METHOD__ will actually prepend the trait name instead of the class name!
up
7
php at kenman dot net
3 years ago
Just learned an interesting tidbit regarding __FILE__ and the newer __DIR__ with respect to code run from a network share: the constants will return the *share* path when executed from the context of the share.

Examples:

// normal context
// called as "php -f c:\test.php"
__DIR__ === 'c:\';
__FILE__ === 'c:\test.php';

// network share context
// called as "php -f \\computerName\c$\test.php"
__DIR__ === '\\computerName\c$';
__FILE__ === '\\computerName\c$\test.php';

NOTE: realpath('.') always seems to return an actual filesystem path regardless of the execution context.
up
14
Tomek Perlak [tomekperlak at tlen pl]
10 years ago
The __CLASS__ magic constant nicely complements the get_class() function.

Sometimes you need to know both:
- name of the inherited class
- name of the class actually executed

Here's an example that shows the possible solution:

<?php

class base_class
{
    function
say_a()
    {
        echo
"'a' - said the " . __CLASS__ . "<br/>";
    }

    function
say_b()
    {
        echo
"'b' - said the " . get_class($this) . "<br/>";
    }

}

class
derived_class extends base_class
{
    function
say_a()
    {
       
parent::say_a();
        echo
"'a' - said the " . __CLASS__ . "<br/>";
    }

    function
say_b()
    {
       
parent::say_b();
        echo
"'b' - said the " . get_class($this) . "<br/>";
    }
}

$obj_b = new derived_class();

$obj_b->say_a();
echo
"<br/>";
$obj_b->say_b();

?>

The output should look roughly like this:

'a' - said the base_class
'a' - said the derived_class

'b' - said the derived_class
'b' - said the derived_class
up
6
meindertjan at gmail dot spamspamspam dot com
3 years ago
A lot of notes here concern defining the __DIR__ magic constant for PHP versions not supporting the feature. Of course you can define this magic constant for PHP versions not yet having this constant, but it will defeat its purpose as soon as you are using the constant in an included file, which may be in a different directory then the file defining the __DIR__ constant. As such, the constant has lost its *magic*, and would be rather useless unless you assure yourself to have all of your includes in the same directory.

Concluding: eye catchup at gmail dot com's note regarding whether you can or cannot define magic constants is valid, but stating that defining __DIR__ is not useless, is not!
up
5
chris dot kistner at gmail dot com
6 years ago
There is no way to implement a backwards compatible __DIR__ in versions prior to 5.3.0.

The only thing that you can do is to perform a recursive search and replace to dirname(__FILE__):
find . -type f -print0 | xargs -0 sed -i 's/__DIR__/dirname(__FILE__)/'
up
1
Anonymous
5 years ago
Further clarification on the __TRAIT__ magic constant.

<?php
trait PeanutButter {
    function
traitName() {echo __TRAIT__;}
}

trait
PeanutButterAndJelly {
    use
PeanutButter;
}

class
Test {
    use
PeanutButterAndJelly;
}

(new
Test)->traitName(); //PeanutButter
?>
up
1
david at thegallagher dot net
5 years ago
You cannot check if a magic constant is defined. This means there is no point in checking if __DIR__ is defined then defining it. `defined('__DIR__')` always returns false. Defining __DIR__ will silently fail in PHP 5.3+. This could cause compatibility issues if your script includes other scripts.

Here is proof:

<?php
echo (defined('__DIR__') ? '__DIR__ is defined' : '__DIR__ is NOT defined' . PHP_EOL);
echo (
defined('__FILE__') ? '__FILE__ is defined' : '__FILE__ is NOT defined' . PHP_EOL);
echo (
defined('PHP_VERSION') ? 'PHP_VERSION is defined' : 'PHP_VERSION is NOT defined') . PHP_EOL;
echo
'PHP Version: ' . PHP_VERSION . PHP_EOL;
?>

Output:
__DIR__ is NOT defined
__FILE__ is NOT defined
PHP_VERSION is defined
PHP Version: 5.3.6
up
-5
madboyka at yahoo dot com
6 years ago
Since namespace were introduced, it would be nice to have a magic constant or function (like get_class()) which would return the class name without the namespaces.

On windows I used basename(__CLASS__). (LOL)
To Top