Php Laravel:在一个对象实例上调用多个方法
我对laravel和oop比较陌生,绝对不是一个专家,所以我不能把我的头放在一些涉及外观的事情上 假设我正在构建一个类来与API交互,为我的电子商务订单创建新的发货标签。该类可以将数据发布到API以创建新的装运,并具有一些属性、要发送到的地址、用于跟踪和跟踪代码的客户端电子邮件等。。。以及创建新发货、获取API返回的价格等方法。。。。类的名称将被删除 在香草php中,我将执行以下操作:Php Laravel:在一个对象实例上调用多个方法,php,oop,laravel,Php,Oop,Laravel,我对laravel和oop比较陌生,绝对不是一个专家,所以我不能把我的头放在一些涉及外观的事情上 假设我正在构建一个类来与API交互,为我的电子商务订单创建新的发货标签。该类可以将数据发布到API以创建新的装运,并具有一些属性、要发送到的地址、用于跟踪和跟踪代码的客户端电子邮件等。。。以及创建新发货、获取API返回的价格等方法。。。。类的名称将被删除 在香草php中,我将执行以下操作: $shipment = new shipment() $shipment->create($data)
$shipment = new shipment()
$shipment->create($data)
$price = $shipment->getPrice()
但在拉威尔,我喜欢使用正面。因此,我创建了我的Shipping facade并注册了一个服务提供商,该服务提供商返回一个带有“Shipping”绑定的新装运。现在我知道如果我这样做了
Shipment::create($data)
拉威尔会的
$app->['shipment']->create($data)
现在我的误解来了。如果我现在执行Shipping::getPrice,laravel会创建Shipping类的另一个实例,还是使用在Shipping::create上创建的同一个实例
我确实希望继续使用第一个实例来访问装运对象属性,这些属性由API返回的数据填充,而不是创建装运类的新实例,因为如果不首先调用create方法,新类的属性仍然为空
我需要做什么
$shipment = Shipment::create()
然后通过访问getPrice方法
$shipment->getPrice()
或者这是一种错误的方法,是否有更好、更laravel/OOP的方法
重新表述我的问题:在通过facade/IoC绑定对对象进行实例化之后,如何继续调用对象上的方法,而不在后续调用中创建新实例?反之亦然,如果我多次通过facade演示Class::randomMethod,是否每次都会实例化一个新的demoClass
千万次提前感谢 如果使用facades,您将始终获得相同的对象实例 如果使用以下命令绑定类:
App::bind('shipment', function()
{
return new \Shipment\Shipment;
});
有正面:
use Illuminate\Support\Facades\Facade;
class Shipment extends Facade {
protected static function getFacadeAccessor() { return 'shipment'; }
}
还有你们班:
namespace Shipment;
class Shipment {
private $data;
public function create($data) {
$this->data[] = $data;
}
public function getPrice() {
return implode(' ',$this->data);
}
}
您可以简单地运行:
Shipment::create('something');
Shipment::create('something2');
echo Shipment::getPrice();
你会得到输出
something something2
因为该类将数据保存在数组中,并获取内爆数据。正如您所见,您不需要创建任何额外的变量,因为您对同一对象进行操作。您的创建方法是否创建了对象?这让回答有点困难。尝试选择更好的名称,也许是填充?它不创建对象不,它只与API对话,并用API的响应填充对象属性。因此,在使用这些方法时,我需要使用相同的实例。但是如果我想创建另一个实例,我想创建一个新实例并再次调用该实例上的方法。谢谢你的回答!但如果我是对的,我认为每次需要执行App::singleton时都要使用相同的实例。如果您执行App:bind,我以为它会在每个facade调用中返回一个新实例?@LuukVanDongen它会返回相同的对象实例。正如您在上面的示例中看到的。如果没有,结果会不同。现在,您在两次不同的调用中两次为object设置了一些值,在第三次调用中,您得到了它们的值,因此对象必须是相同的。所以每次我使用facade时,我认为laravel都会执行app->make[object]->方法。所以每次都应该实例化一个新对象。或者,如果使用了门面,laravel是否会搜索同名的现有对象,并调用该对象上的方法,而不是创建新对象?@LuukVanDongen,正如您在上面的示例中所看到的,它不会创建新对象。它将使用相同的object,但是app::bind和app::singleton之间有什么区别?既然两者都返回同一个对象?