2012-05-07 3 views
2

나는 이상한 버그가있는 경우 기본 이름은() 제거 완료 다음 코드에서 $file :PHP의 기본 이름() 제거 변수, 이상한 효과

$files = glob(DIR_APPLICATION . 'controller/module/*.php'); 

if ($files) { 

    foreach ($files as $file) { 

     $extension = basename($file, '.php'); 
     print($file).'<br />'; 

나는 위의 print() 코드를 추가 할 경우, debuging basename 예상대로 작동합니다. 아래에 추가하면 $file이 완전히 제거됩니다.

왜 이런 이유가있을 수 있습니까?

if ($files) { 

    foreach ($files as $file) { 

     echo $file . '<br />'; 
     var_dump($file); 
     echo '<br />'; 
     $extension = basename($file, '.php'); 
     var_dump($file); 
     echo '<br /><br />'; 

PHP 버전 5.3.10

+1

무엇'위해서 var_dump ($ 파일), '이전과 이후'basename' 쇼 ? – zerkms

+0

@zerkms 이것은 문자열이 (63) 이전이고 아무 것도 정의하지 않은 것을 나타냅니다. –

+1

"nothing"을 정의하십시오. 또한 화면에 표시된 것처럼 ** 변수의 두 정확한 출력 **을 표시하십시오. – zerkms

답변

1

var_dump이 보여줍니다 사람이 읽을 수있는 문자의 수보다 당신의 문자열에 대해 서로 다른 길이를 제공합니다 (구체적으로, 각 길이는 평상시보다 6 크다).

이것은 basename 설명서에이 멀티 바이트 문자 경로와 올바른 기본 이름을 볼 수 있도록, 그래서

기본 이름은() 로케일 인식 말한다 동안 경로 이름이 일치하는 로케일이해야, 멀티 바이트 문자가 포함 된 것을 의미한다 setlocale() 함수를 사용하여 설정하십시오.

그래서, 문제를 해결하기 위해 내가 제안 :

  1. 사용 bin2hex 또는 각 경로를 구성하는 모든 바이트의 서수를 볼 비슷한; 이것은 경로 이름의 어떤 문자가 1 바이트가 아닌지 알려줍니다. 6 바이트의 차이는 이라는 뜻이며은 3 자일 것입니다. 따라서 내 초능력은 www이 정확하게 보이지 않을 수도 있음을 알려줍니다.

  2. 가능한 경우 문제가되는 디렉터리의 이름을 단일 바이트 문자열로 변경하면 문제가 자동으로 해결됩니다.

  3. 상기 다음, 불가능하면 :

    가. 반환 된 경로가 어떤 인코딩인지 알아보십시오.

    b. 멀티 바이트 문자열 함수를 사용하여 인코딩을 전달하는 사용자 고유의 basename 구현을 작성합니다.

2

나에게 좋은 것 같습니다 :

<?php 
$file = '/path/to/some/file.php'; 
var_dump($file); 
var_dump(basename($file, '.php')); 
var_dump($file); 

string(22) "/path/to/some/file.php" 
string(4) "file" 
string(22) "/path/to/some/file.php" 

http://codepad.org/E9Nb1SUG

+0

예,이 시간은 과거 수백 번 이었지만 이번에는 저에게 효과적이었습니다. –

2

당신이 그것을 작동 여부 코드의 상단에이 한 줄을 추가하여 확인할 수 있습니다 ..

echo basename('/home/shop/www/admin/controller/module/cloudbackup.php', '.php'); exit;