2016-03-03 2 views
0

У меня возникла проблема с вызовом переменной, включенной в класс. Что мне здесь не хватает? Заранее благодарю вас за поддержку. Очень ценится.Php Включить свойства в классе

//index2.php 
$var2 = 'var2'; 



//index.php 
class something { 
    __construct() { 
    include('index2.php');  
    } 
} 


$run_it = new something(); 

echo $run_it->var2; //how do I call var2? 
+0

Не сделали PHP в течение длительного времени, но не будет ли '$ var2' просто просто существовать в рамках' __construct() ', а затем быть недоступным после этого? –

+0

Не были ли какие-либо ответы полезными для вас? Если нет, по крайней мере, у вас есть завиток, и если это решит проблему, отметьте ее. Если ни один, по крайней мере, не комментирует это? – Xorifelse

ответ

0

Вы не можете расширить свойство класса с включенными файлами. Класс определяется как написанный. У вас есть следующие способы динамического добавления кода в класс.

  1. Расширить класс.
  2. Используйте черты (копирование вставки функции в классе)
  3. Использование magic methods (__call, __get, __set)

В этом примере будет печатать переменные, определенные в глобальной области видимости (например, ваш пример), как вы хотите его делать. Однако это не так, как следует использовать, и я предлагаю найти другой метод написания вашего класса.

include 'somefile.php'; // <?php $var3 = 'testing' ?> 

class foo{ 
    public $var2 = 'var2'; # should be declared within the class. 

    public function __get($name){ 
    // property 'var3' is not defined in the class so this method is magically called instead. 
    if(isset($GLOBALS[$name])){ 
     return $GLOBALS[$name]; // Here we return the value $var3 defined in the global scope. 
    } else { 
     trigger_error("Call to undefined variable '$name'"); 
    } 
    } 

    public function __construct(){ # Missed function statement. 
    echo 'hello'; 
    } 
} 

$c = new foo(); 
echo $c->var3; // testing 
+0

Как удалить ваше свойство в другой файл и включить его в метод построения? – Andrew

+0

Вы не можете, классы определяются так, как они закодированы. Содержимое не может быть добавлено с помощью include или require. Возможно, вы захотите взглянуть на черты, которые позволяют использовать многоразовый код или, возможно, расширить класс, могут выполнять эту работу. – Xorifelse

+1

Вы можете сделать '$ this-> var2 = include ('index2.php');' в конструкторе, если 'index2.php' возвращает значение; Нечетный, но, конечно, один из способов установить свойство класса из файла include. – jszobody

0

Если index2.php содержит это:

$var2 = 'var2'; 

Затем вы можете включить этот файл, чтобы получить доступ к $var2. Затем можно передать эту переменную в свой something конструктору в качестве аргумента:

//index.php 

class something { 

    public $var2; 

    public function __construct($arg) { 
     $this->var2 = $arg; 
    } 
} 

include 'index2.php'; 

$run_it = new something($var2); 

echo $run_it->var2; // echos 'var2' 

Очевидно, существуют и другие способы, чтобы сделать что-то вроде того, что вы пытаетесь сделать (там, как правило, больше, чем один способ сделать большинство вещей), но действительно самый разумный способ получить внешние данные в ваш объект - передать его через аргументы конструктора.

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

0

Вы могли бы это сделать. Вид странным образом делать вещи, но здесь идет:

index.php

<?php 
class something{ 
    function __construct() { 
    include('index2.php');  
    } 
} 

//s1 
$s1 = new something(); 
$s1->var2 = 'var2 changed'; 

//s2 
$s2 = new something(); 

//print em out 
print_r($s1); 
print_r($s2); 

index2.php

<?php 
    $this->var2 = 'var2'; //$this pseudo-variable works because we're including index2.php within the scope of our class instance 
?> 

Выход $ PHP a.php

something Object 
(
    [var2] => var2 changed 
) 
something Object 
(
    [var2] => var2 
) 
0

Я согласен с Xorifelse, вы можете сделать это с чертами. пример.

fields.php

trait Aa { 

public $fields = [ 
    "name"=>"string->5", 
    "number"=>"integer->3", 
    ]; 
} 

черты.php

include('fields.php'); 

class ABC { 

use Aa; 

public function __set($field,$value) 
{ 
    if(array_key_exists($field,$this->fields)) 
    { 
    $this->fields[$field] = $value; 
    } 
    else 
    { 
    $this->fields[$field] = null; 
    } 
} 

public function __get($field) 
{ 
    if(array_key_exists($field,$this->fields)) 
    { 
    return $this->fields[$field]; 
    } 
    else 
    { 
    return null; 
    } 
} 
} 

$ a = новый ABC();

$ a-> number = 111;

var_dump ($ a-> fields);

array(2) { 
["name"]=> 
string(9) "string->5" 
["number"]=> 
int(111) 
} 

var_dump ($ a-> number);

int(111) 
0

Вы можете воспользоваться get_defined_vars. Предполагая, что ваши переменные в файле (например, filevars.php):

filevars.php

<?php 
$name = 'myName'; 
$address = 'myAddress'; 
$country = 'myCountry'; 
$phones = array('123456789','987654321'); 
?> 

Вы можете добавить метод к классу (getVars) и определить свойство (vars), который оборачивает все переменные существующие в filevars.php:

класса test.php

<?php 
class Test 
{ 
    public $vars; 

    function getVars() 
    { 
     include ('filevars.php'); 
     $this->vars = get_defined_vars(); 
    } 
} 
?> 

Использование

<?php 
include ('class-test.php'); 
$myClass = new Test(); 
$myClass->getVars(); 
print_r($myClass->vars); 
?> 

Выход:

Array 
{ 
    [name] => myName 
    [address] => myAddress 
    [country] => myCountry 
    [phones] => Array 
    { 
     [0] => 123456789 
     [1] => 987654321 
    } 
} 

Вы можете также обратиться любое лицо, включены переменные, например: echo $myClass->vars['country']; // myCountry

Смежные вопросы