Obter o nome do arquivo de script atual


273

Se eu tenho um script PHP, como posso obter o nome do arquivo dentro desse script?

Além disso, dado o nome de um script do formulário jquery.js.php, como posso extrair apenas a parte "jquery.js"?


1
Essas são duas perguntas em uma. Qual você quer saber? Como saber o nome do script atual, como cortar a extensão de um nome de arquivo ou ambos?
Pekka

3
A palavra alsoindica que você está fazendo uma pergunta adicional. Sheesh. Alguns espreitam crianças.
digiscripter

Respostas:


411

Basta usar a constante mágica do PHP__FILE__ para obter o nome do arquivo atual.

Mas parece que você quer a parte sem .php. Assim...

basename(__FILE__, '.php'); 

Um removedor de extensão de arquivo mais genérico ficaria assim ...

function chopExtension($filename) {
    return pathinfo($filename, PATHINFO_FILENAME);
}

var_dump(chopExtension('bob.php')); // string(3) "bob"
var_dump(chopExtension('bob.i.have.dots.zip')); // string(15) "bob.i.have.dots"

O uso de funções padrão da biblioteca de strings é muito mais rápido , como seria de esperar.

function chopExtension($filename) {
    return substr($filename, 0, strrpos($filename, '.'));
}

1
Por que não simplesmente usar substre strrchrtirar o último .e tudo o que está por trás dele?
ThiefMaster 19/11/2010

9
@ThiefMaster Porque há algo embutido no PHP para lidar com extensões de arquivo. A roda existe e rola bem.
alex

2
Mas uma regex pode ser mais cara!
ThiefMaster 19/11/2010

14
Enquanto __FILE__dá-lhe o .phparquivo que linha está em, você realmente quer $_SERVER['SCRIPT_NAME']para o script de nível superior atualmente em execução (o que foi invocado pelo servidor web ou diretamente na linha de comando)
de Drew Stephens

2
@ Drew Eu acho que depende do que você realmente quer.
alex

125

Quando você quiser que seu include saiba em que arquivo ele está (ou seja, qual nome de script foi realmente solicitado), use:

basename($_SERVER["SCRIPT_FILENAME"], '.php')

Porque quando você está gravando em um arquivo, geralmente sabe o nome dele.

Editar: Como observado por Alec Teal, se você usar links simbólicos, ele exibirá o nome do link simbólico.


4
Isso foi útil para mim)) necessários para obter o nome do arquivo de script, em arquivo necessário )
Denys Klymenko

4
Isso está errado, ele não receberá o arquivo PHP real, mas o arquivo que o servidor da Web resolveu para a solicitação. Diferente se você usar simlinks.
Alec Teal

Também é diferente se você usa PHP-FPM.
precisa

Além disso, se você precisar da extensão também, usepathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd Se você precisar da extensão, omita o segundo parâmetro ...
SparK 14/03


56

Aqui está a diferença entre basename(__FILE__, ".php")e basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")mostra o nome do arquivo em que esse código está incluído - significa que se você incluir esse código no header.php e a página atual for index.php , ele retornará o cabeçalho, não o índice .

basename($_SERVER["REQUEST_URI"], ".php")- Se você incluir esse código no header.php e a página atual for index.php , ele retornará o índice não o cabeçalho .


qual é mais seguro SCRIPT_FILENAMEou REQUEST_URI? Eu sei que os dois são vários servidores, mas não é REQUEST_URIum valor violado pelo usuário? ele permite uma "injeção de URI" ameaça
faísca

1
os dois têm sua própria impotência, mas você pode proteger seu URL usando diferentes arquivadores, como mysql_real_escape_string, stripslashes etc.
Khandad Niazi

5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");retornará o nome da pasta se o link for do formulário http://example.com/somefolder. Enquanto basename($_SERVER['PHP_SELF'], ".php");sempre retornará o nome do script, neste caso index.
Jun

27

Isso pode ajudar:

basename($_SERVER['PHP_SELF'])

funcionará mesmo se você estiver usando o include.


Isso ainda deixa .phpno final que o OP estava tentando se livrar
Brian Leishman

3
@stumpx Então você pode fazerbasename($_SERVER['PHP_SELF'], ".php");
katalin_2003

Eu tenho 2 arquivos, header.php e home.php, o header.php é chamado em home.php como posso detectar no cabeçalho que a página atual é home.php ou contact.php para que eu possa alterar algum banner etc.
Moxet Khan

19

a resposta de alex está correta, mas você também pode fazer isso sem expressões regulares como:

str_replace(".php", "", basename($_SERVER["SCRIPT_NAME"]));

6
Isso corre o risco de confundir um nome de arquivo como hey.php-i-am-a-weird-filename.php.
alex

Eu já pensei nisso, mas achei que eles estavam usando a página única mencionada na pergunta. Você também pode verificar se o ".php" está no final da string. Não estou dizendo que sua pergunta está errada, mas expressões regulares podem ser uma espécie de problema e geralmente são usadas em cenários em que um método muito mais simples e com menos recursos pode ser usado.
User

Shofner Fiz alguns benchmarks e seu caminho é duas vezes mais rápido, mas mesmo assim, com mais de 1000 iterações, a diferença é 0,003231 microssegundos.
alex

16

Aqui está uma lista que encontrei recentemente pesquisando uma resposta:

//self name with file extension
echo basename(__FILE__) . '<br>';
//self name without file extension
echo basename(__FILE__, '.php') . '<br>';
//self full url with file extension
echo __FILE__ . '<br>';

//parent file parent folder name
echo basename($_SERVER["REQUEST_URI"]) . '<br>';
//parent file parent folder name with //s
echo $_SERVER["REQUEST_URI"] . '<br>';

// parent file name without file extension
echo basename($_SERVER['PHP_SELF'], ".php") . '<br>';
// parent file name with file extension
echo basename($_SERVER['PHP_SELF']) . '<br>';
// parent file relative url with file etension
echo $_SERVER['PHP_SELF'] . '<br>';

// parent file name without file extension
echo basename($_SERVER["SCRIPT_FILENAME"], '.php') . '<br>';
// parent file name with file extension
echo basename($_SERVER["SCRIPT_FILENAME"]) . '<br>';
// parent file full url with file extension
echo $_SERVER["SCRIPT_FILENAME"] . '<br>';

//self name without file extension
echo pathinfo(__FILE__, PATHINFO_FILENAME) . '<br>';
//self file extension
echo pathinfo(__FILE__, PATHINFO_EXTENSION) . '<br>';

// parent file name with file extension
echo basename($_SERVER['SCRIPT_NAME']);

Não se esqueça de remover :)

<br>


1
Então ... SCRIPT_NAME, SCRIPT_FILENAME e PHP_SELF são três coisas diferentes, certo? (Por que tantas vars com mesmo valor ?! Rasmus estava em drogas, com certeza)
faísca

Cenário: index.phpinclui o header.phpque por sua vez inclui functions.php, onde log_location()reside. Eu chamo log_location()em header.php, em seguida, eu corro index.php. Todas as funções acima imprimem função, índice ou domínio ou alguma variação delas. Não quero saber qual script PHP chamou de função. É mesmo possível (em uma linha)? @begoyan
s3c 18/02

6

você também pode usar isto:

echo $pageName = basename($_SERVER['SCRIPT_NAME']);

4

Uma maneira mais geral seria usar pathinfo () . Desde a versão 5.2, ele suportaPATHINFO_FILENAME .

assim

pathinfo(__FILE__,PATHINFO_FILENAME)

também fará o que você precisa.


2

$ argv [0]

Eu achei muito mais simples de usar $argv[0]. O nome do script em execução é sempre o primeiro elemento da $argvmatriz. Ao contrário de todos os outros métodos sugeridos em outras respostas, esse método não requer o uso de basename()para remover a árvore de diretórios. Por exemplo:

  • echo __FILE__; retorna algo como /my/directory/path/my_script.php

  • echo $argv[0]; retorna my_script.php



2

Isso funciona para mim, mesmo quando executado dentro de um arquivo PHP incluído, e você deseja que o nome do arquivo php atual seja executado:

$currentPage= $_SERVER["SCRIPT_NAME"];
$currentPage = substr($currentPage, 1);
echo $currentPage;

Resultado:

index.php


0
$filename = "jquery.js.php";
$ext = pathinfo($filename, PATHINFO_EXTENSION);//will output: php
$file_basename = pathinfo($filename, PATHINFO_FILENAME);//will output: jquery.js

0

__FILE__ use exemplos com base nos resultados do servidor localhost:

echo __FILE__;
// C:\LocalServer\www\templates\page.php

echo strrchr( __FILE__ , '\\' );
// \page.php

echo substr( strrchr( __FILE__ , '\\' ), 1);
// page.php

echo basename(__FILE__, '.php');
// page

0

Como alguns disseram basename($_SERVER["SCRIPT_FILENAME"], '.php')ebasename( __FILE__, '.php') são boas maneiras de testar isso.

Para mim, usar o segundo foi a solução para algumas instruções de validação que eu estava fazendo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.