以下代码在一个简单的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
会使你的代码变得混乱、无法维护,并且会让你的生活变得地狱。
有人可能会更好地解释这一点,但继承使用父类定义。如果创建父类的实例并更改其中的变量,则实际上不会更改父类定义,因此子类仍将使用原始定义。
要解释如何使用您的Son
和Dad
类:
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 类的函数或访问器,它将返回该销售的总值。继承更适合如果您有不同类型的"销售",这些"销售"具有不同的行为/属性,但也有共同的行为/属性。