LINUX.ORG.RU

PHP и глобальные переменные

 


0

1

Есть два файла main.php и other.php, в main находятся только переменные:

<?php
namespace SpaceMyProject;
$user = "user1";
$pass = "pass1";
?>

в other:
<?php
namespace SpaceMyProject;
require_once "main.php";

class MyClass {
 function One() {
     global $user, $pass;
     echo "One: ".$user." ".$pass;
 }
 function Two() {
     global $user, $pass;
     echo "One: ".$user." ".$pass;
 }
}

$myclass = new MyClass();
$myclass->One();
$myclass->Two();
?>

Как написать так, что бы в other не указывать в каждой функции
global $user, $pass;
а обращаться сразу?

Ответ на: комментарий от Deleted

А по другому никак? Как-то глобально после require_once нельзя инициализировать, что бы далее по всему файлу в любом классе были доступны?

pleiotropy
() автор топика
Ответ на: комментарий от Deleted

<?php 

namespace SpaceMyProject;

    public function Bar($user, $pass) {
       
        $user = "user1";
        $pass = "pass1";
    }
            
<?php
namespace SpaceMyProject;
require_once "main.php";

class MyClass {
 function One() {
     $this->Bar($user, $pass);
     echo "One: ".$user." ".$pass;
 }
 function Two() {
     $this->Bar($user, $pass);
     echo "One: ".$user." ".$pass;
 }
}

$myclass = new MyClass();
$myclass->One();
$myclass->Two();

Как-то так.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

что бы в other не указывать в каждой функции

Никак. Используй синглтон или di.

no-such-file ★★★★★
()
Ответ на: комментарий от pleiotropy

А по другому никак?

Любители глобальных переменных должны страдать.

no-such-file ★★★★★
()
Ответ на: комментарий от pleiotropy

global лучше стараться не использовать. Глобальные переменные могут вызвать конфликт, если их имена одинаковые. И вообще они становятся доступны отовсюду из кода, что совсем небезопасно.

Deleted
()

А тебе точно нужны переменные? Может константы подойдут, их можно использовать без global.

define('PASS', 'test');

...

echo PASS;
no-such-file ★★★★★
()
Ответ на: комментарий от Deleted

В моем домашнем проекте местами тоже используется global, надо бы переделать это в передачу синглтоном

Deleted
()
Ответ на: комментарий от Deleted

Да, я читал об опасности глобальных, но ведь в каждой известной цмс есть файл config.php или settings.php в которых идут глобальные переменные для имен, паролей и прочего к базе данных например. Как такое правильно организовать, настройки к базе?

pleiotropy
() автор топика
Ответ на: комментарий от pleiotropy

Попробуй через константы как товарищ выше привел пример.

Deleted
()
Ответ на: комментарий от no-such-file

Мне нужно, что бы был один глобальный файл настроек, например settings.php, в нем все настройки к базе, и его мы инклюдим во всех остальных частях программы получая доступ к настройкам.

pleiotropy
() автор топика
Ответ на: комментарий от pleiotropy

есть файл config.php или settings.php в которых идут глобальные переменные для имен, паролей и прочего к базе данных например. Как такое правильно организовать, настройки к базе?

Там как раз обычно используют константы, т.к. в процессе работы менять это дело совершенно не зачем. Если тебе прям очень хочется переменные, и без заморочек, то используй массив+функцию:

namespace config;
$cfg = [
'pass' => 'qwerty',
'user' => 'foo',
];

function get() {
global $cfg;
return $cfg;
}

...

namespace mycode;

echo config\get()['user'];

Но таки синглтон было бы полезнее освоить.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Немного по другому написал:

function db($key) {
global $db_settings;
return $db_settings[$key];
}
...
echo db('name');

pleiotropy
() автор топика
Ответ на: комментарий от no-such-file

Там как раз обычно используют константы

Из друпала восьмого:

$databases['default']['default'] = array (
  'database' => '',
  'username' => '',
  'password' => '',
  'prefix' => '',
  'host' => '',
  'port' => '',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

pleiotropy
() автор топика
Ответ на: комментарий от ritsufag

Ты бы еще opencart привел как пример.

А что с друпалом не так, dроде его считают одной из лучших cmf, разве это не так? Что тогда считается хорошим?

pleiotropy
() автор топика
Ответ на: комментарий от pleiotropy

Да, я читал об опасности глобальных, но ведь в каждой известной цмс есть файл config.php или settings.php в которых идут глобальные переменные для имен, паролей и прочего к базе данных например. Как такое правильно организовать, настройки к базе?

Не смотри цмс

лучше потратить время на фреймворки
http://symfony.com/doc/current/setup.html
https://framework.zend.com/manual/2.3/en/user-guide/overview.html

kiotoze ★★★★
()
глобальные переменные моветон - варианты решения:

+ передавай вместо глобальных переменных параметр
+ используй примеси со статик-переменными или статик-переменные в корневом классе
+ man registry pattern
anonymous
()
Ответ на: комментарий от pleiotropy

но ведь в каждой известной цмс есть файл config.php или settings.php в которых идут глобальные переменные для имен, паролей и прочего к базе данных например

Плохая практика. То, что она массовая — не значит, что так нужно делать и в своих проектах.

Как такое правильно организовать, настройки к базе?

Например, передавая в файл конфигурации ссылку на приложение. Или в приложении парсить .ini

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.