Một ngày đẹp mắt trời bạn tiến hành câu lệnh thân quen thuộc để đưa ra vớ cả phiên bản ghi trong bảng users. Mẩu chuyện hết sức đơn giản và dễ dàng nếu bạn áp dụng Eloquent trong Laravel là xong.
Bạn đang xem: Mảng object trong php
//get all user$users = User::first();Thay bởi trả về một collection model như hàm all(), hàm first() này trả về một model instance.
Để kéo ra thuộc tính name của model instance bên trên cũng dễ dàng thôi. Các bạn dùng câu lệnh
$user->name;// hoặc$user<"name">;Bài toán vẫn được giải quyết và xử lý nhưng đợi một chút, ta bỗng dưng nhận ra mã sản phẩm instance tê vừa gọi theo kiểu object được vừa gọi theo kiểu array được. Vậy nó là object tốt array?
2. Object với array trong PHPĐể xác minh nó là object tuyệt array thì ta đi sang 1 chút về hai có mang này vào PHP.
Array(Mảng) là list các thành phần có thuộc kiểu tài liệu và nó là một trong trong các kiểu tài liệu trong php gồm độ phức tạp giám sát cao. Bao gồm 2 nhiều loại mảng là mảng một chiều hoặc mảng nhiều chiều. Riêng rẽ với PHP thì các phần tử của mảng hoàn toàn có thể không thuộc kiểu dữ liệu, và các thành phần của mảng được truy nã xuất thông qua các chỉ mục(vị trí) của nó phía trong mảng.
Khởi chế tạo và call tới một phần tử vào array gồm rất nhiều cách để đơn giản ta sử dụng cú pháp sau:
$array = <>;$array<"foo"> = "bar";$array<"baz-bar"> = "science"; echo $array<"foo">; //barecho $array->foo; //FailCòn với object câu hỏi khởi tạo và call ra như sau
$object = ;$object->foo = "bar";$object->"baz-bar" = "science" echo $object->foo; //barecho $object<"foo"> // Fail Như tác dụng ta thấy lúc ta điện thoại tư vấn đến nằm trong tính vào object mà áp dụng cú pháp <> sẽ thông tin lỗi ngay. Vậy điều gì đã khiến cho model instance trong laravel có thể sử dụng cả cú pháp hotline của object cùng array ?
3. Mày mò về ArrayAccessCùng lấn sân vào phân tích một ít xem Laravel đã làm những gì để biến chuyển một mã sản phẩm instance linh hoạt đến vậy.
Đầu tiên rất có thể thấy mã sản phẩm User extend từ Authenticatable và class đó lại extend model trong thư mục vendor. Túm váy đầm lại là lúc ta điện thoại tư vấn đến User::first() thực tiễn là call hàm first() vào class model trong thư mục IlluminateDatabaseEloquentModel.php. Không, đầy đủ thứ không đơn giản như thế. Chẳng bao gồm hàm first() nào trong mã sản phẩm cả. Nó được hotline thông qua một magic fucntion __callStatic rồi lại gọi đến magic function __call.
public function __call($method, $parameters) if (in_array($method, <"increment", "decrement">)) return $this->$method(...$parameters); return $this->newQuery()->$method(...$parameters); Ở đây một Builder được tạo ra rồi gọi đến $method ở đấy là first. Liên tiếp vào folder Illuminate/Database/Eloquent/Builder.php search vẫn ko thấy hàm first ?? wtf ??
May thừa nhìn chỗ nào class Builder nó có thực hiện Trait với thương hiệu là BuildsQueries mò vào đây ta bắt đầu thấy được hàm first() (metghe).
Chúng ta đừng vội lưu ý đến hàm first vị nó chưa hẳn chìa khóa nhằm trả lời thắc mắc mà đầu bài họ đã nêu ra. Hãy quan sát phần đầu của class mã sản phẩm nó implements ArrayAccess. Nếu như bạn hay phát âm code php thuần thì chắc chắn đã phân biệt vẫn đề nằm ở chỗ này rồi nhỉ?
PHP thuần cung ứng cho ta một số trong những class cùng interfaces được chế tạo sẵn. Những class và interfaces này có thể chấp nhận được nhà cải cách và phát triển PHP thêm những tính năng vào ngôn ngữ, thường xuyên được giành cho những framework.
Xem thêm: ÄIá»U Trá» Ung Thư Gan Hcc, Tìm Hiểu Về Ung Thư Gan Nguyên Phát
Lên document của php gọi thì ta thấy nó cung ứng cho ta 4 abstract method
abstract public bool offsetExists ( mixed $offset )abstract public mixed offsetGet ( mixed $offset )abstract public void offsetSet ( mixed $offset , mixed $value )abstract public void offsetUnset ( mixed $offset )Vì mã sản phẩm của bọn họ được implements từ bỏ ArrayAccess nên lúc implements sẽ rất cần được
override lại 4 method trên.
Mò xuống code thì chính xác là Laravel đã có tác dụng như vậy. Nhưng điều chúng ta quan trọng tâm ở đây là chuyện gì đã xẩy ra khi bọn họ cố tình hotline thuộc tính của một object theo cú pháp của một array lúc sử dụng model instance của Laravel.
$user<"name">;Khi chúng ta gọi như vậy, bằng 1 cách magic ở trong nhà phát triển, khoác định chúng ta đã điện thoại tư vấn đến abstract method offsetGet. Tôi đã làm debug ra công dụng là như vậy.
Cùng xem hàm này sau thời điểm override lại trường đoản cú ArrayAccess interface đã xử lý gì nhé.
public function offsetGet($offset) return $this->getAttribute($offset);nó truyền vào 1 param khi dump ra các bạn sẽ nhận được giá trị là key của một mảng. Cụ thể ở đây là name. Kiếm tìm tiếp vào hàm getAttribute($offset) xem nó có tác dụng gì.
Tôi vẫn lục tung cả class model ra mà cần yếu tìm thấy hàm getAttribute(). Class mã sản phẩm cũng không extend class làm sao khác, tưởng như đang đi đến đường cụt thì tôi bắt gặp cú pháp này vào phần đầu của class Model
use ConcernsHasAttributes, ConcernsHasEvents, ConcernsHasGlobalScopes, ConcernsHasRelationships, ConcernsHasTimestamps,Không còn nghi vấn gì nữa, mã sản phẩm ở trên đây đã sử dụng Trait (Tìm hiểu về Trait). Kiên trì một chút tôi sẽ tìm thấy hàm getAttribute() trong thư mục IlluminateDatabaseEloquentConcernsHasAttributes.php.
public function getAttribute($key) Ở hàm này xúc tích sẽ lao vào hàm if đồ vật 2 có nghĩa là tồn trên key trùng với attributes
if (array_key_exists($key, $this->attributes) || $this->hasGetMutator($key)) //Nhảy vào chỗ này return $this->getAttributeValue($key); Sau đó điện thoại tư vấn đến những hàm getAttributeValue() và tạm dừng ở hàm getAttributeFromArray().Ở phía trên ta hoàn toàn có thể tìm được giải đáp của câu hỏi ta đề ra ở đầu bài. Nó trả về 1 value của mảng attributes trong model User với key = name rõ ràng là name của bảng users như Nguyễn Văn A chẳng hạn.
/** * Get an attribute from the $attributes array. * *
return mixed */ protected function getAttributeFromArray($key) if (isset($this->attributes<$key>)) return $this->attributes<$key>; 4. Tổng kếtVậy là sau đó 1 hồi suy đoán ta sẽ hiểu được tại sao model instance này lại linh hoạt thực hiện được cú pháp của array. Thực ra mã sản phẩm instance trả về 1 object nhưng bởi implements ArrayAccess nên rất có thể sử dụng cú pháp array. Nội dung bài viết đồng thời được đăng bên trên blog cá thể của mình.
Lời cuối xin cảm ơn chúng ta đã đọc nội dung bài viết của mình. Bài tiếp sau mình sẽ chỉ ra xem Laravel đã kết nối với DB như thế nào?