自定义 Laravel 类中的变量继承始终返回空



以下代码在一个简单的PHP文件中效果很好:

class Dad
{
protected $age = 10;
}
class Son extends Dad 
{
public function age()
{
return $this->age + 10;
}
}
$dad = new Dad();
$son = new Son();
print_r($son->age());

它按预期打印值20,这意味着Son类能够访问$age变量。

现在,将此代码切换到Laravel项目中,我最终得到如下内容:

控制器

class CustomersController extends Controller
{
public function refresh(Request $request)
{
$sale = new AppClassesCustomerSale;
$sale->setItems($request->items);
$total = new AppClassesCustomerTotal;       
print_r($total->getItems());
}
}

班级销售

namespace AppClassesCustomer;
class Sale 
{
protected $items;
public function setItems($_items)
{
$this->items = $_items;
}
}

班级总计

namespace AppClassesCustomer;
class Total extends Sale 
{
public function getItems()
{
return $this->items;
}
}

print_r($total->getItems())的结果是array(0) {}.这意味着它可以访问变量,但不知何故它没有得到值?

我显然检查items是否真的收到了什么东西,以及我是否将setItems功能更改为:

public function setItems($_items)
{
$this->items = $_items;
print_r($this->items);
}

它正确打印值。我错过了什么?

我错过了什么?

您缺少对实例化和继承工作原理的基本了解。在这里,您可以找到有关实例是什么的全面解释。忽略Java标签,该信息也完全与PHP相关。

一旦你有了基本的理解,请阅读PHP基础知识。之后,您将看到您的方式错误:

class CustomersController extends Controller
{
public function refresh(Request $request)
{
$sale = new AppClassesCustomerSale;
$sale->setItems($request->items);
$total = new AppClassesCustomerTotal;       
print_r($total->getItems());
}
}

在这里,您将在$sale中创建Sale类的新实例,并在$total中创建Total类的新实例。虽然这些实例由它们的相对类描述,并且Total继承Sale之后,但它们彼此不共享任何值,除了您声明为默认值的值。如果你在$sale中设置了一个值,$total将无法知道它。因此,如果您需要设置项目,请执行以下操作:

$total = new AppClassesCustomerTotal;       
$total->setItems($request->items);

此代码将起作用。另一种方法是声明$items静态。static关键字"使(属性(无需类实例化即可访问"。你可以在这里阅读所有关于它的信息。

但要小心,过多地使用static会使你的代码变得混乱、无法维护,并且会让你的生活变得地狱。

有人可能会更好地解释这一点,但继承使用父类定义。如果创建父类的实例并更改其中的变量,则实际上不会更改父类定义,因此子类仍将使用原始定义。

要解释如何使用您的SonDad类:

class Dad
{
protected $age = 10;
public function getsOlder()
{
return $this->age + 10;
}
}
class Son extends Dad 
{
public function age()
{
return $this->age + 10;
}
}
$dad = new Dad();
$dad->getsOlder(); // $dad->age should be 20 here
// If we create a new instance of dad, the age of the new dad will be same as the class definition, 10
$stepDad = new Dad();
// Son is inheriting the class definition of the Dad class where the age is 10, NOT the $dad nor $stepDad instance
$son = new Son();
print_r($son->age()); // This will show 20 because son's age is 10 at this stage

对于您的 laravel 案例,如果您试图获得销售类的总数,我认为您走错了路。总计可以只是 Sale 类的函数或访问器,它将返回该销售的总值。继承更适合如果您有不同类型的"销售",这些"销售"具有不同的行为/属性,但也有共同的行为/属性。

相关内容

  • 没有找到相关文章

最新更新