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.