Php вывести переменную класса

Вывод переменной из класса PHP

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

У меня есть два файла. product.php а также index.php. Product.php определяет класс продукта, и я просто использую index.php в качестве страницы для вывода переменных. В идеале это будет использоваться для вывода объектов из разных классов в будущем.

class Product < public $var = "a default value"; public function __construct($var)< $var = $var; >public function displayVar()< echo $this->var; > > 

index.php (все вложенные в теги php явно)

require_once("product.php"); $product = new Product(); echo $product->var; 

Я пробовал с разными способами включения файла (требуют, включают, включают в себя). Я не уверен, что это проблема.

Проблема, которую я получаю, заключается в том, что $ product-> var не выводится. Вместо этого я получаю следующую ошибку:

Notice: Undefined property: Product::$var in C:\xampp\htdocs\FurnitureWebsite\index.php on line 21 

Я не совсем уверен, почему он считает эту переменную неопределенной. Я просмотрел документацию по PHP о классах и свойствах, но ничего, что действительно было похоже на ответ.

Последнее замечание: я пробовал это с классом, определенным в index.php, и он работал нормально. Это заставляет меня думать, что может быть что-то не так с моим путем к файлу, но имя файла написано правильно, и файлы находятся в тех же каталогах, поэтому я не совсем уверен.

Решение

Explainations

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

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

Тем не менее, если вы хотите получить доступ к своему значению без вызова метода, существует множество решений.

Решение 1: инстанцирование и прямой вызов переменной

class Product < public $var = 'a default value'; >$product = new Product(); echo $product->var; 

Решение 2: использование средства доступа для получения защищенного / частного значения

class Product < protected $var = 'a default value'; public function getVar() < return $this->var; > > $product = new Product(); echo $product->getVar(); 

Решение 3: использование конструктора для инициализации значения

class Product < protected $var; public function __construct($var = 'a default value') < $this->var = $var; /* $this->var stands for protected $var */ /* $var stands for. $var in the parameters */ > public function getVar() < return $this->var; > > $product = new Product(); /* no value, so $var = 'a default value'; */ echo $product->getVar(); 

Решение 4: использование статической переменной

class Product < public static $var = 'a default value'; >echo Product::$var; 

Решение 5: использование статического метода с защищенным статическим значением

class Product < protected static $var = 'a default value'; public static function getVar() < return self::$var; >> echo Product::getVar(); 

Источник

Читайте также:  Css horizontal scroll width

get_class_vars

Возвращает объявленные по умолчанию свойства указанного класса.

Список параметров

Возвращаемые значения

Возвращает ассоциативный массив объявленных свойств класса, видимых из текущей области видимости, с их значением по умолчанию. Получившиеся элементы массива имеют форму varname => value . В случае возникновения ошибки возвращается false .

Примеры

Пример #1 Пример использования get_class_vars()

var $var1 ; // переменная не имеет начального значения.
var $var2 = «xyz» ;
var $var3 = 100 ;
private $var4 ;

// конструктор
function __construct () // изменим значения некоторых свойств
$this -> var1 = «foo» ;
$this -> var2 = «bar» ;
return true ;
>

$class_vars = get_class_vars ( get_class ( $my_class ));

foreach ( $class_vars as $name => $value ) echo » $name : $value \n» ;
>

Результат выполнения данного примера:

var1 : var2 : xyz var3 : 100

Пример #2 get_class_vars() и поведение области видимости

function format ( $array )
return implode ( ‘|’ , array_keys ( $array )) . «\r\n» ;
>

class TestCase
public $a = 1 ;
protected $b = 2 ;
private $c = 3 ;

public static function expose ()
echo format ( get_class_vars ( __CLASS__ ));
>
>

TestCase :: expose ();
echo format ( get_class_vars ( ‘TestCase’ ));
?>

Результат выполнения данного примера:

// 5.0.0 a| * b| TestCase c a| * b| TestCase c // 5.0.1 - 5.0.2 a|b|c a|b|c // 5.0.3 + a|b|c a

Смотрите также

User Contributed Notes 15 notes

If you want to retrieve the class vars from within the class itself, use $this.

var $a ;
var $b ;
var $c ;
var $d ;
var $e ;

function GetClassVars ()
return array_keys ( get_class_vars ( get_class ( $this ))); // $this
>

$class_vars = $Foo -> GetClassVars ();

foreach ( $class_vars as $cvar )
echo $cvar . «
\n» ;
>
?>

Produces, after PHP 4.2.0, the following:

I needed to get only the class static variables, leaving out instance variables.

function get_static_vars ( $class ) $result = array();
foreach ( get_class_vars ( $class ) as $name => $default )
if (isset( $class ::$ $name ))
$result [ $name ] = $default ;
return $result ;
>
?>

That function returns only the public ones. The same pattern can be used inside a class, then it returns private and protected static variables, too:

static protected function get_static_vars ( $class = NULL ) if (!isset( $class )) $class = get_called_class ();
$result = array();
foreach ( get_class_vars ( $class ) as $name => $default )
if (isset( $class ::$ $name ))
$result [ $name ] = $default ;
return $result ;
>
?>

There seems to be be a function to get constants missing , i.e. get_class_constants() . so here is a simple function for you all. Hopefully Zend will include this in the next round as a native php call, without using reflection.

function GetClassConstants ( $sClassName ) $oClass = new ReflectionClass ( $sClassName );
return $oClass -> getConstants ());
>
?>

All 3 of get_object_vars, get_class_vars and reflection getDefaultProperties will reveal the name of the array. For serialization I recommend:

$cName = get_class ( $this );
$varTemplate = get_class_vars ( $cName )
foreach ( $varTemplate as $name => $defaultVal ) <
$vars [ $name ] = $this -> $name ; // gets actual val.
>
?>

No scan the $vars and create serialization string how you wish.

This protects against erroneous prior deserializing in maintaining the integrity of the class template and ignoring unintended object properties.

Читайте также:  Css display inline block vertical align top

If you need get the child protected/private vars ignoring the parent vars, use like this:

class childClass extends parentClass private $login ;
private $password ;

public function __set ( $key , $val ) if ( $key == ‘password’ )
$this -> $key = md5 ( $val );
else
$this -> $key = $val ;
>
>
class parentClass public $name ;
public $email ;

function __construct () $reflection = new ReflectionClass ( $this );
$vars = array_keys ( $reflection -> getdefaultProperties ());
$reflection = new ReflectionClass ( __CLASS__ );
$parent_vars = array_keys ( $reflection -> getdefaultProperties ());

$my_child_vars = array();
foreach ( $vars as $key ) if (! in_array ( $key , $parent_vars )) $my_child_vars [] = $key ;
>
>

$child_class = new childClass ();
?>

So I wanted to get a list of the public parameters in a child class using a static function pre-5.3.0 (< 5.3.0). In 5.3.0+ you would use the new 'static' like you would 'self' to get the late binding.

class childClass extends parentClass
public $id ;
public $name ;

public static function getFields ()
return self :: _getFields ( __CLASS__ );
>

>
abstract class parentClass
public $idInParent ;
public $nameInParent ;

abstract public static function getFields ();

final protected static function _getFields ( $className )
$rtn = array();
foreach ( array_keys ( get_class_vars ( $className )) as $var ) $rtn [] = $var ;
>
return $rtn ;
>

var_dump ( childClass :: getFields ());
?>

Results:
array(4) [0]=>
string(2) «id»
[1]=>
string(4) «name»
[2]=>
string(10) «idInParent»
[3]=>
string(12) «nameInParent»
>

class someClass public function toArray () $records = array();

foreach( $this as $key => $value ) $records [ $key ] = $value ;
>

I propse following for getting Public members, always:
if (! function_exists ( «get_public_class_vars» )) function get_public_class_vars ( $class ) return get_class_vars ( $class );
>
>
if (! function_exists ( «get_public_object_vars» )) function get_public_object_vars ( $object ) return get_object_vars ( $object );
>
>
?>

This is to mitigate the problem and a feature that get_object_vars($this) returns private members. Running it simply outside the scope will get the public.

Iterating public members only and their defaults are enormously useful in e.g. in serialization classes such as options where each public member is an serializable that is saved and loaded.

If you assign a constant value using the self-scope by default to a variable, get_class_vars() will result in a FATAL error.

class Foo const Bar = «error» ;

print_r ( get_class_vars ( «Foo» ));

?>

. but using «Foo::Bar» instead «self::Bar» will work 😉

in PHP5 to get all the vars (including private etc.) use:

$reflection = new ReflectionClass($class);
$defaults = $reflection->getdefaultProperties();

Contrary to multiple comments throughout the manual, get_class_vars() performed within a class can access any public, protected, and private members.

class Foo public $x ;
protected $y ;
private $z ;
public function __sleep () return( get_class_vars ( __CLASS__ ) );
>
>
?>

works fine (returns x, y, & z). However, given the same class as above,

print_r ( get_class_vars ( «Foo» ) );
?>

will NOT return x, y, & z. Instead it will only return the public members (in our case, z).

This is one of the best php functions. Look at what you can do

class Object
var $updtFields;//keep track of affected values
function Object($record=»») if (is_array($record))
$this->updtFields = array();
foreach(array_keys(get_class_vars(get_class($this))) as $k)
if (isset($record[$k]))
$this->$k = $record[$k];
$this->updtFields[] = $k;
>
>
>//end of arrayToObject

Читайте также:  Pivot table python count

function toDebug($nl=’
‘)
foreach(array_keys(get_class_vars(get_class($this))) as $k)
echo «$k = [» . $this->$k . «]»;
>//end of toDebug
>

and you define your class like this
class Person extends Object var $name; //same same as in the form
var $phone;
>

when you submmit the form, you can get the data like

//everything in just one line,cool!! Also if you use pear db or adodb when you get data from the database you can do the same thing except use the $row that you get from the database. Remember to ask the result is associative mode.

This is my core Object for everthing I do and it works great.

get_class_vars_assoc()
— Returns an associative array with name of (parent) class(es) as key(s) and corresponding class vars as sub-arrays. My boilerplate for some crude O/R mapping.

Note: vars re-defined in sub-classes are ignored.

class GrandClass public $grandVar ;
public $in_grand_and_parent ;
public $in_grand_and_child ;

public static function load () print_r ( self :: get_class_vars_assoc ());
>

protected static function get_class_vars_assoc () $called = get_called_class ();
//echo «called: $called \n»;
$classVars [ $called ] = array_keys ( get_class_vars ( $called ));

$parent = get_parent_class ( $called );
while ( $parent !== FALSE ) //echo «parent: $parent \n»;
$classVars [ $parent ] = array_keys ( get_class_vars ( $parent ));
$classVars [ $called ] = array_diff ( $classVars [ $called ],
$classVars [ $parent ]);
if ( isset( $prevParentVars ) ) $prevParentVars = array_diff ( $prevParentVars ,
$classVars [ $parent ]);
>

$prevParentVars = & $classVars [ $parent ];
$parent = get_parent_class ( $parent );
>

class ParentClass extends GrandClass public $in_grand_and_parent ;
public $parentVar ;
public $in_parent_and_child ;
>

class ChildClass extends ParentClass public $in_grand_and_child ;
public $in_parent_and_child ;
public $childVar ;
>

[ParentClass] => Array
(
[1] => parentVar
[2] => in_parent_and_child
) [GrandClass] => Array
(
[0] => grandVar
[1] => in_grand_and_parent
[2] => in_grand_and_child
)

Источник

Вывод переменной из класса PHP

Я быстро просмотрел некоторые из подобных вопросов, но ни один из ответов не затронул проблему, которую я испытываю. У меня есть два файла. product.php и index.php. Product.php определяет класс продукта, и я просто использую index.php в качестве страницы для вывода переменных. В идеале это будет использоваться для вывода объектов из разных классов в будущем. product.php

class Product < public $var = "a default value"; public function __construct($var)< $var = $var; >public function displayVar()< echo $this->var; > > 
require_once("product.php"); $product = new Product(); echo $product->var; 

Я пробовал использовать различные методы включения файла (require, include, include_once). Я не уверен, что это проблема. Проблема, которую я получаю, это $product- > var, которая не выводится. Вместо этого я получаю следующую ошибку:

Notice: Undefined property: Product::$var in C:\xampp\htdocs\FurnitureWebsite\index.php on line 21 

Я не совсем уверен, почему он рассматривает эту переменную undefined. Я просмотрел документацию PHP по классам и свойствам, но ничего не было похоже на ответ. Последнее замечание: я пробовал это с классом, определенным в index.php, и он работал нормально. Это заставляет меня думать, что может быть что-то не так с моим файловым путем, но имя файла написано правильно, а файлы находятся в одних и тех же каталогах, поэтому я не совсем уверен.

Источник

Оцените статью