Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   PHP область видимости переменной (http://forum.oszone.net/showthread.php?t=282873)

morebeauty 29-05-2014 16:25 2357319

PHP область видимости переменной
 
Народ, помогите разобраться.
У меня есть файл index.php
PHP код:

<?php
$a 
1;
function 
foo(){
echo 
$a//ничего не выводит
global $a;
echo 
$a//выводит 1
}
foo(); 
require 
'file1.php';

вот код file1.php
PHP код:

<?php
echo $a//выводит 1
function foo2(){
echo 
$a//ничего не выводит
global $a;
echo 
$a//НИЧЕГО НЕ ВЫВОДИТ
}
foo2();

То есть когда я включаю файл2 в файл1, все переменные, видимые в файле1 становятся видимыми в файле2. Но если я в файле2 создам функцию, то в ней увидеть переменные файла1 уже не получается, даже используя global или GLOBALS['variable'].
А мне это очень нужно. Помогите пожалуйста.

Sham 30-05-2014 14:51 2357771

не выдумывайте, после global всё выводится

morebeauty 31-05-2014 10:35 2358089

Цитата:

Цитата Sham
не выдумывайте, после global всё выводится »

Ну да... пример взял из головы, не проверив.
Не работает в более сложном варианте.

читать дальше »

index.php
PHP код:

<?php
require 'classes\app.php';
app::Run('project1','cfg');

app.php
PHP код:

<?php
class app{
    
private static $_instance;
    
public static function getInstance(){
        if(!
self::$_instance){
            
self::$_instance = new self();
        }
        return 
self::$_instance;
    }
    
public static function Run($proj,$conf){
        require 
"./protected/$proj/$conf.php";
        require 
'db.php';
        
$db = new PDO("mysql:host={$cfg['db_props']['host']};dbname={$cfg['db_props']['name']}",$cfg['db_props']['user'],$cfg['db_props']['pass']);
        
$path $cfg['path'];
        
//$db = DB::getInstance();
        //$db->setProps($cfg['db_props']);
        //$db=$db->connect();
        
require "./protected/$proj/site.php";
    }
}

cfg.php
PHP код:

<?php
$cfg 
= array (
    
'db_props' => array (
        
'host' => 'localhost',
        
'user' => 'root',
        
'pass' => '',
        
'name' => 'db1',
        
'prefix' => 'mm_'
    
),
    
    
'db_model' => array (
        
'user' => array (
            
'table' => 'mm_users',
            
'fields' => array (
                
'id',
                
'login',
                
'password',
                
'email',
                
'owner',
                
'regdata',
                
'birthday',
                
'confirmed'
            
)
        ),
        
'group' => array (
            
'table' => 'mm_groups',
            
'fields' => array (
                
'id',
                
'group'
            
)
        ),
    ),
    
    
'path' => array (
        
'classes' => 'classes',
        
'tpl' => 'templates'
    
),
);

site.php
PHP код:

<?php
SESSION_START
();

$path $cfg['path'];
require 
'/' $path['classes'] . '/dbobj.php'

//foreach ($cfg['db_model'] as $key => $value){
//    require '/' . $path['classes'] . '/' . $key . '.php';
//}
spl_autoload_register(function ($class) {
    global 
$path;
  require 
'/' $path['classes'] . '/' $class '.php';
});
//echo $cfg['path']['classes'];
$group = new group(1,$db);
$curGroup=$group->getRow();
echo 
$curGroup['id'];

так вот, функция

PHP код:

spl_autoload_register(function ($class) {
    global 
$path;
  require 
'/' $path['classes'] . '/' $class '.php';
}); 

не видит переменную $path

идем дальше

group.php
PHP код:

<?php
class group extends dbobj{
    
private $row;
    
private $stmt;
    
public function __construct($id,$db){
        
        
parent::__construct(self);
        
$this->db=$db;
        
$this->stmt = array (
            
'byid' => $db->prepare('SELECT :fld FROM :tbl WHERE id=:id'),
        );
        
//$row = self::$row;
        //$stmt = $db->prepare('SELECT :fld FROM :tbl WHERE id=:id');
        
$this->stmt['byid']->bindValue(':fld','*');
        
$this->stmt['byid']->bindValue(':tbl',$this->table);
        
$this->stmt['byid']->bindValue(':id',$id);
        
$this->stmt['byid']->execute();
        echo 
$this->table;
        
$this->row $this->stmt['byid']->fetch(PDO::FETCH_ASSOC);
    }
    
public function getRow(){
        
//echo "123";
        
return $this->row;
    }
}

мне пришлось в конструктор передавать переменную $db, потому что global $db не работало. А переменная определена еще в файле app.php на стадии запуска (функция run). Внутри этой функции после определения переменной подключается файл site.php, в котором переменные $db и $cfg видны. Но вот в классах, которые подключаются в site.php уже даже global не помогает. Объясните мне в чем дело, я запутался.


Sham 01-06-2014 18:32 2358550

в app::Run не вижу глобальных $db и $path, они там локально объявлены. Внутри класса свойства удобнее, app::$db, app::$path будут отовсюду видны.

morebeauty 03-06-2014 04:53 2359206

Цитата:

Цитата Sham
в app::Run не вижу глобальных $db и $path, они там локально объявлены. Внутри класса свойства удобнее, app::$db, app::$path будут отовсюду видны »

А ну да, чего-то затупил. А как тогда мне сделать суперглобальные переменные (типа $_SERVER), которые будут видны во всем приложении без лишних строк, типа globals или GLOBAL['']? Или это невозможно?

Sham 04-06-2014 01:21 2359642

Код:

$GLOBALS['db']


Время: 20:44.

Время: 20:44.
© OSzone.net 2001-