Php Laravel:在一个对象实例上调用多个方法

Php Laravel:在一个对象实例上调用多个方法,php,oop,laravel,Php,Oop,Laravel,我对laravel和oop比较陌生,绝对不是一个专家,所以我不能把我的头放在一些涉及外观的事情上 假设我正在构建一个类来与API交互,为我的电子商务订单创建新的发货标签。该类可以将数据发布到API以创建新的装运,并具有一些属性、要发送到的地址、用于跟踪和跟踪代码的客户端电子邮件等。。。以及创建新发货、获取API返回的价格等方法。。。。类的名称将被删除 在香草php中,我将执行以下操作: $shipment = new shipment() $shipment->create($data)

我对laravel和oop比较陌生,绝对不是一个专家,所以我不能把我的头放在一些涉及外观的事情上

假设我正在构建一个类来与API交互,为我的电子商务订单创建新的发货标签。该类可以将数据发布到API以创建新的装运,并具有一些属性、要发送到的地址、用于跟踪和跟踪代码的客户端电子邮件等。。。以及创建新发货、获取API返回的价格等方法。。。。类的名称将被删除

在香草php中,我将执行以下操作:

$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之间有什么区别?既然两者都返回同一个对象?