G_manX

ответов0 / помог0

Переменная и namespace

1679703242
Для того чтобы вызвать функцию из "namespace" в другом "namespace" используется use function, для константы use const, а как вывести переменную? То есть, как вызвать переменную $other_var из файла "egg.php", из namespace user\original в другом файлике, где namespace xopa и уже есть переменная с таким же именем $other_var Должно получится две переменные с одинаковыми именами из разных namespace и разными значениями. Код файла egg.php:

namespace user\original;
 
class user{
public $name = "класс из библиотеки <br>";     
}
 
class home{
public $name = "класс 'home' из библиотеки <br>";      
} 
 
const myConst = "а это константа из библиотеки <br>";
 
function print_s($value){
echo $value;
}
 
$other_var = "переменная из библиотеки"; // как ее вывести в коде ниже?

Файл, где используется код из "egg.php", из namespace "user\original"

namespace xopa;
 
include "include/egg.php";     
 
class user {
public $name = "мой класс <br>";
}
                                       
use \user\original\user as other_user, \user\original\home as other_home;                                       
use const \user\original\myConst;                                
use function \user\original\print_s;  
 
 
$names = [
$my_user     = new user(), 
$second_user = new other_user(), 
$class_home  = new other_home()
];
 
foreach($names as $items){
echo $items->name;
}
 
 
echo myConst;                      
print_s("функция из библиотеки"); 
 
$other_var = "моя переменная <br>";  // уже есть переменная с именем $other_var из namespace "xopa"
echo $other_var;    // как здесь помимо этой переменной вывести еще $other_var  из namespace "user\original"
long399
ответов3 / помог3
1679703802
Хотя любой корректный PHP-код может находиться внутри пространства имён, только классы (включая абстрактные и трейты), интерфейсы, функции и константы зависят от него. Т.е. переменные в пространство имен не попадают. https://www.php.net/manual/ru/language.namespaces.definition.php
G_manXвлепить жирный лайк
liris
ответов6 / помог6
Обновлен 1679704411
«То есть, как вызвать переменную $other_var из файла "egg.php",[» Не нужно вызывать другие переменные из других файлов. Чем меньше вы хотите стрелять себе в ногу, тем лучше для вас же. Есть рекомендация - один файл, один класс, раскладывается по папочкам и через пространства имен можно очень удобно всем этим делом управлять. Соблюдаете правила инкапсуляции, используете приватные поля через публичные методы, согласуете все типы данных, согласно вашей диаграмме классов. И не делаете себе и людям голову глупыми вопросами. И всё у вас работает как часы. Касательно переменных - чем меньше у них видимость, тем лучше для вас же. Вы оставляете меньше возможностей запутать себя и других (кто будет разбираться в вашем коде). Чем меньше кода вне функции/класса - тем лучше. Чем короче код в функции/методе - тем лучше.
G_manXвлепить жирный лайк
sash
ответов0 / помог0
1679704568
А ещё лучше даже не начинать. Нет таланта нефиг лезть
влепить жирный лайк
skkx
ответов1 / помог0
1679704930
Я думаю если G_manX откроет храм господний, он обязательно в подавле храма сделает ночной клуб, со всеми пошлостями)
влепить жирный лайк
G_manX
ответов0 / помог0
1679705149
liris, Я понял, что так нельзя делать. Но чисто теоретически, это возможно сделать? То есть, вызвать переменную из другого namespace? А если в библиотеке/фреймворке будет переменная с именем, которая есть у меня? long399, Т.е. переменные в пространство имен не попадают. Это значит, что я не смогу реализовать свою задумку? А если в библиотеке/фреймворке будет переменная с именем, которая есть у меня? skkx, Так php позволит ли мне реализовать мою задумку? То есть, вызывать переменную из другого namespace в другом namespace? Или это невозможно?
влепить жирный лайк
long399
ответов3 / помог3
1679705299
«Это значит, что я не смогу реализовать свою задумку? А если в библиотеке/фреймворке будет переменная с именем, которая есть у меня?» Обычно, во фреймворках реализуется MVC подход, который подразумевает использование ООП. Т.е. переменные в файлах не лежат. Там лежат классы. Причем, как уже писали выше: «Есть рекомендация - один файл, один класс, раскладывается по папочкам и через пространства имен можно очень удобно всем этим делом управлять.»
G_manXвлепить жирный лайк
long399
ответов3 / помог3
1679706177
G_manX, я такого не встречал. Обычно библиотека содержит набор классов, в них могут быть перечислены константы и поля, к которым уже можно обратиться используя пространства имен. Сама по себе переменная в библиотеке, не ассоциированная ни с одним классом, это странно, на мой взгляд.
G_manXвлепить жирный лайк
G_manX
ответов0 / помог0
1679705453
long399, а как насчет библиотек?
влепить жирный лайк
sad67man
ответов2 / помог2
1679706483
G_manX, На практике namespace используют только для классов. Потому что вместо функций вы можете написать класс со статическим. методом. Тоже самое и с переменными и константами - можно написать классы с константами и статическими свойствами

<?php
 
namespace user\original;
 
class user{
    public $name = "класс из библиотеки <br>";
}
 
class home{
    public $name = "класс 'home' из библиотеки <br>";
}
 
class MyClass
{
    public const MY_CONST = "а это константа из библиотеки <br>";
 
    public static $other_var = "переменная из библиотеки";
 
    public static function print_s($value)
    {
        echo $value;
    }
}

<?php
 
namespace xopa;
 
class user {
    public $name = "мой класс <br>";
}
 
use \user\original\user as other_user, \user\original\home as other_home;
use \user\original\MyClass;
 
 
$names = [
    $my_user     = new user(),
    $second_user = new other_user(),
    $class_home  = new other_home()
];
 
foreach($names as $items){
    echo $items->name;
}
 
 
echo MyClass::MY_CONST;
MyClass::print_s("функция из библиотеки");
 
$other_var = "моя переменная <br>";
echo $other_var;
echo MyClass::$other_var;
G_manXвлепить жирный лайк
Fart83
ответов3 / помог3
1679706809
G_manX, «Так php позволит ли мне реализовать мою задумку? То есть, вызывать переменную из другого namespace в другом namespace? Или это невозможно?» возможно, если использовать require/include, то в порядке "живой" очереди переменные "зайдут". но здесь 1 нюанс - это все из за семантики php с namespace, где namespace должен писать раньше. поэтому, я полагаю, это только так выглядит.

<?php //file app/A/ClassA.php
namespace App\A;
 
$a = 1;
 
class ClassA
{
    public function get(){echo __CLASS__;}
}
 
<?php //file public/index.php
require_once "../app/A/ClassA.php";
require_once "../app/B/ClassB.php";
 
use App\A\ClassA;
 
$classA = new ClassA();
$classA->get();
 
echo $a;//1
но, если все это "пропустить" через SPL, который в основном регистрирует все что связано с ооп, то такой трюк не пройдет. SPL лоялен к define, но const NAME - не "проглотит". ПС с SPL могу что то упустить, но общую суть передал
G_manXвлепить жирный лайк
Сначала вход
A B i U S JS PHP HTML CSS SQL C C++ C# PYTHON JAVA
Для входа только имэйл или имя и апроль
Можно сменить аватар
Имэйл Ваше имя
Пароль