Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » PHP область видимости переменной

Ответить
Настройки темы
PHP область видимости переменной

Аватара для morebeauty

Старожил


Сообщения: 210
Благодарности: 29

Профиль | Отправить PM | Цитировать


Народ, помогите разобраться.
У меня есть файл 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'].
А мне это очень нужно. Помогите пожалуйста.

Отправлено: 16:25, 29-05-2014

 

Deadooshka


Сообщения: 2566
Благодарности: 698

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:51, 30-05-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для morebeauty

Старожил


Сообщения: 210
Благодарности: 29

Профиль | Отправить PM | Цитировать


Цитата 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 не помогает. Объясните мне в чем дело, я запутался.


Отправлено: 10:35, 31-05-2014 | #3


Deadooshka


Сообщения: 2566
Благодарности: 698

Профиль | Отправить PM | Цитировать


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

Отправлено: 18:32, 01-06-2014 | #4


Аватара для morebeauty

Старожил


Сообщения: 210
Благодарности: 29

Профиль | Отправить PM | Цитировать


Цитата Sham:
в app::Run не вижу глобальных $db и $path, они там локально объявлены. Внутри класса свойства удобнее, app::$db, app::$path будут отовсюду видны »
А ну да, чего-то затупил. А как тогда мне сделать суперглобальные переменные (типа $_SERVER), которые будут видны во всем приложении без лишних строк, типа globals или GLOBAL['']? Или это невозможно?

Отправлено: 04:53, 03-06-2014 | #5


Deadooshka


Сообщения: 2566
Благодарности: 698

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$GLOBALS['db']

Отправлено: 01:21, 04-06-2014 | #6



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » PHP область видимости переменной

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной. NiOl Скриптовые языки администрирования Windows 7 31-01-2019 19:58
CMD/BAT - [решено] В переменной содержится имя переменной opravdin Скриптовые языки администрирования Windows 3 28-01-2013 11:11
[решено] cms Joomla, подключение файла в модуль, область видимости переменных zvezda_t Вебмастеру 10 24-02-2011 11:45
Передача переменной из PHP в JavaScript rulllesss Вебмастеру 1 25-07-2005 09:27
php деление значения строковой переменной Guest Вебмастеру 4 14-10-2004 17:12




 
Переход