Diğer dosya PHP değişken NULL olarak geri geliyor

2 Cevap php

Bir PHP dosyasında Bu kodu vardır:

require_once $_SERVER['DOCUMENT_ROOT'] . '/custom/functions.php';
global $testVar;
var_dump($testVar);

functions.php dosyasında, birkaç diğer fonksiyonlar takip başında bu var:

function pr($s) {
    echo '<pre>', htmlspecialchars(print_r($s,true)), '</pre>';
}

$testVar = 'hello world';

Ilk dosyayı çalıştırırken, değişken NULL olarak geri geliyor. Ben global biraz eklendi ancak gerekli olmamalıdır. Bu bir Joomla modülünün bir parçasıdır ama önce, sadece normal PHP gibi çalışması gerekir dosyaları da dahil olmak üzere sorunları vardı hiç. Neden bu oluyor olabilir?

2 Cevap

Birincisi, bu tür yerine JPATH_BASE olarak Joomla'nın yolu sabitleri kullanmayı deneyin $_SERVER['DOCUMENT_ROOT']. Joomla yararlı sabitler bir yeri vardır, bu belgeler bulunuyor kontrol edin.

Cevabını okudum ve okuma php belgeleri ben iki kere global anahtar kelime kullanmanız gerekir neden bir sebep bulmaya çalıştı.

İlk olarak, Variable scope.

The scope of a variable is the context within which it is defined. For the most 
part all PHP variables only have a single scope.

(...)

However, within user-defined functions a local function scope is introduced. 
Any variable used inside a function is by default limited to the local 
function scope.

Değişkeni bir işlev kapsamında değildir, bu yüzden NULL garip bir davranış olduğunu düşündüm bu yüzden.

Ama sonra include okumak ve ilginç bir şey buldum:

(...)
Any variables available at that line in the calling file will be available 
within the called file, from that point forward. However, all **functions** 
and **classes** defined in the included file have the global scope.

Ben değişkenler bu paragrafta küresel olma konusunda herhangi bir söz göremiyorum. Yani, böyle global değişkenler kullanmak istediğiniz zaman hantal ya da olmamak, çözüm yapılacak doğru şey, o seens.

Bunu yaparken hantal olup olmadığını durumda, ben basit bir sınıf yaratacak. Eğer dosyada sadece yardımcı fonksiyonları varsa, nitelik olarak yöntemler ve $ TestVar bir sürü bir class Util{} oluşturun.

Ben çalışmak gibi görünüyor bir çözüm bulduk: Başlangıçta değişken ayarlarken global anahtar ikisini de kullanarak, ve bunu kullanmak gerekir önce.

(Ancak bu oldukça hantal, ve ben hala o olur neden emin değilim, bu yüzden herkesin daha iyi bir çözüm varsa, göndermek için çekinmeyin.)