Я быстро осмотрел некоторые из похожих на мой вопрос вопросов, но ни один из ответов не затронул проблему, с которой я столкнулся.
У меня есть два файла. 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;
}
}
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, и он работал нормально. Это заставляет меня думать, что может быть что-то не так с моим путем к файлу, но имя файла написано правильно, и файлы находятся в тех же каталогах, поэтому я не совсем уверен.
Прежде всего, в вашем классе вы указали переменную для вашего конструктора. Но эта переменная является обязательной (то есть значение по умолчанию отсутствует). Так при создании нового продукта вы должны указать.
Кроме того, если вы используете конструктор, нет необходимости присваивать переменной значение по умолчанию перед вызовом конструктора.
Тем не менее, если вы хотите получить доступ к своему значению без вызова метода, существует множество решений.
class Product {
public $var = 'a default value';
}
$product = new Product();
echo $product->var;
class Product {
protected $var = 'a default value';
public function getVar() {
return $this->var;
}
}
$product = new Product();
echo $product->getVar();
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();
class Product {
public static $var = 'a default value';
}
echo Product::$var;
class Product {
protected static $var = 'a default value';
public static function getVar() {
return self::$var;
}
}
echo Product::getVar();
class Product{
public $var = "a default value";
public function __construct($var){
$this->var = $var;
}
public function displayVar(){
return $this->var;
}
}
require_once("product.php");
$product = new Product('Product Name');
echo $product->displayVar();
class Product{
protected $var;
public function __construct($var = "a default value"){
$this->var = $var;
}
public function getVar(){
return $this->var;
}
}
$product = new Product();
echo $product->getVar();
new Product('your value')
, ваш пример не имеет значения, которое дано конструктору$var=$var
делать $this->var=$var
__construct($var = "a default value")
лучше, чем непосредственно на имуществоprotected
не public
иначе не нужен геттер и переменная может быть изменена извне напрямуюgetter
для переменной, которая возвращает значение, а не echo
Это.Это оно.
В вашем конструкторе у вас есть это:
public function __construct($var){
$var = $var;
}
Измените это на:
public function __construct($var){
$this->var = $var;
}
в настоящее время он просто устанавливает переданную переменную себе.
Во-вторых, в вашем файле index.php вы создаете такой объект:
$product = new Product();
поскольку ваш конструктор ожидает получения некоторой переменной, вы всегда должны предоставлять ее.
Например:
$product = new Product('new text');
Я вижу, что у вас есть метод для отображения переменной. Это хорошо, хотя обычным делом является создание такой переменной как protected
а затем создание public
getter
метод доступа к защищенным переменным извне класса.
Затем вы можете просто вызвать свой метод из файла index.php следующим образом:
$product->displayVar();
или создайте метод get, который вернет вашу переменную и отобразит ее в файле index.php.
например.
/**product.php**/
public function getVariable() {
return $this->var;
}/**index.php**/
$product = new Product('new text');
echo $product->getVariable();
Это зависит от того, нужно ли вам отображать эту переменную или вы знаете, что эта переменная вам понадобится для других целей. В любом случае, я думаю, что создавать геттер лучше и из-за хорошей привычки.
Я надеюсь, что это помогает. Удачи!
у тебя есть
public function __construct($var){
$var = $var;
}
должно быть:
public function __construct($var){
$this->var = $var;
}
Пожалуйста, измените ваш код, как это
product.php
<?php class Product{
public $var ;
public function __construct($var){
$this->var = $var;
} } ?>
index.php
<?php require_once 'product.php';
$product = new Product('a default value');
echo $product->var; ?>
Это может помочь вам.
Спасибо