PHP SplObjectStorage so với mảng
Làm cách nào tôi có thể truy xuất một đối tượng được lưu trữ trong SplObjectStorage dựa trên một khóa duy nhất? Show storage->attach($obj, []); } public function assign1($obj,$id) { $this->storage[$obj] = $id; } public function findByID1($id) { $this->storage->rewind(); while($this->storage->valid()) { if($id == $this->storage->getInfo()) { return $this->storage->current(); } $this->storage->next(); } return false; } public function assign2($obj,$id) { $this->map[$id]=spl_object_hash($obj); } public function findByID2($id) { $hash=$this->map[$id]; return getObjectBasedOnHash($hash); } } $obj=(object)['foo' => 'bar']; $foo=new Foo(); $foo->add($obj); // Bây giờ id của đối tượng này đã được biết $id=11111;
$foo->assign1($obj,$id);
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn Khái niệmCommotionĐăng ngày 6 tháng 1 năm 2017 Khái niệmCommotion
Đăng ngày 6 tháng 1 năm 2017 (đã chỉnh sửa) Xin lỗi, tôi mới nhận ra rằng tôi đã không đính kèm tất cả tập lệnh trong thẻ tập lệnh storage = new SplObjectStorage(); $this->map=[]; } public function add($obj) { $this->storage->attach($obj, []); } public function assign1($obj,$id) { $this->storage[$obj] = $id; } public function findByID1($id) { $this->storage->rewind(); while($this->storage->valid()) { if($id == $this->storage->getInfo()) { return $this->storage->current(); } $this->storage->next(); } return false; } public function assign2($obj,$id) { $this->map[$id]=spl_object_hash($obj); } public function findByID2($id) { $hash=$this->map[$id]; //return getObjectBasedOnHash($hash); //How is this accomplished? } } $obj=(object)['foo' => 'bar']; $foo=new Foo(); $foo->add($obj); //Now this object's id is known $id=11111; $id=123321; //Option 1 $foo->assign1($obj,$id); $obj1=$foo->findByID1($id); //Option 2 $foo->assign2($obj,$id); $obj2=$foo->findByID2($id);Được chỉnh sửa vào ngày 6 tháng 1 năm 2017 bởi NotionCommotion
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn requinixĐăng ngày 6 tháng 1 năm 2017 requinix
Đăng ngày 6 tháng 1 năm 2017 SplObjectStorage về cơ bản giống như một mảng kết hợp hoạt động với các đối tượng dưới dạng khóa. Bạn đang cố sử dụng nó như vậy, nhưng bạn cũng đang sử dụng các ID này làm khóa. Làm cả hai không có ý nghĩa với tôi
Nếu ID là duy nhất thì tại sao không sử dụng chúng làm khóa?
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn Khái niệmCommotionĐăng ngày 6 tháng 1 năm 2017 Khái niệmCommotion
Đăng ngày 6 tháng 1 năm 2017
Bởi vì tôi không biết khóa khi các đối tượng được thêm vào SplObjectStorage
Chúng là những máy khách tạo kết nối với máy chủ, sau đó giao tiếp với máy chủ và cung cấp cho máy chủ khóa duy nhất của nó. Sau đó, máy chủ có thể được cung cấp khóa duy nhất của một máy khách cụ thể và được yêu cầu gửi thứ gì đó cho máy khách đó
Tôi có thể lặp lại danh sách các đối tượng mỗi lần (như tôi đã chỉ ra trong tùy chọn 1 của mình), nhưng theo nguyên tắc, tôi nghĩ rằng tôi không nên. Vâng, chúng giống như các mảng liên kết, nhưng tôi hiểu rằng chìa khóa không thực sự là đối tượng mà là hàm băm của đối tượng đó. Tại sao tôi không nên lưu trữ hàm băm xác định đối tượng?
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn requinixĐăng ngày 6 tháng 1 năm 2017 requinix
Đăng ngày 6 tháng 1 năm 2017 Sử dụng hàm băm làm khóa thực tế là chi tiết triển khai mà bạn không cần quan tâm. Nếu bạn sử dụng SplObjectStorage thì chỉ cần xử lý các đối tượng
1. "Được yêu cầu làm điều gì đó với khách hàng đó" không thể hoạt động cho đến khi khách hàng đưa chìa khóa. Tại sao khách hàng đợi quá lâu để đưa ra điều đó? 2. Vì mã này không thành vấn đề nếu không có khóa được trao đổi, bạn không cần bận tâm đến việc lưu trữ ứng dụng khách cho đến khi điều đó xảy ra. Chờ cho đến khi bạn có khóa và sau đó lưu trữ đối tượng, do đó loại bỏ nhu cầu về SplObjectStorage ngay từ đầu vì bạn sẽ có sẵn khóa duy nhất (một giá trị vô hướng)
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn Khái niệmCommotionĐăng ngày 6 tháng 1 năm 2017 Khái niệmCommotion
Đăng ngày 6 tháng 1 năm 2017
Và sau đó lặp lại SplObjectStorage để tìm một đối tượng cụ thể có thuộc tính duy nhất?
Cái bắt tay nào?
Điều này có yêu cầu chuyển khóa trên mỗi lần trao đổi không?
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn đáĐăng ngày 6 tháng 1 năm 2017 đá
Đăng ngày 6 tháng 1 năm 2017 Tôi sẽ hỏi tại sao máy khách lại là người tạo ra các khóa này chứ không phải máy chủ? . Nếu máy chủ tạo khóa thì bạn sẽ có nó ngay từ đầu
Đối với phương pháp tùy chọn 2 của bạn, tại sao lại sử dụng hàm băm? public function assign2($obj,$id) { $this->map[$id]=$obj; } public function findByID2($id) { return $this->map[$id]; }Không cần SplObjectStorage hoặc hàm băm cho một id đơn giản để ánh xạ đối tượng như thế
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn Khái niệmCommotionĐăng ngày 6 tháng 1 năm 2017 Khái niệmCommotion
Đăng ngày 6 tháng 1 năm 2017
Các ứng dụng khách không tạo các khóa này mà được gán một khóa theo cách thủ công, chẳng hạn như 3512e089-861e-427f-a4eb-c9187f03a7d4. Cẩn thận sẽ không bao giờ sao chép một khóa
Do không biết key khi nhận đồ lần đầu. Đối tượng được tạo khi khách hàng tạo kết nối và đối tượng được lưu bằng cách sử dụng $this->clientList->attach($client, []);.
Ngay sau khi máy khách kết nối với máy chủ, máy khách sẽ gửi cho máy chủ GUID của nó. Lý do tôi làm như vậy là gấp đôi
Liệu điều này có ý nghĩa gì? app = $app; $this->url_sockets=$url_sockets; $this->clientList = new SplObjectStorage(); } public function start() { $loop = Factory::create(); $socket = new SocketServer($loop); $socket->on('connection', function (\React\Socket\ConnectionInterface $client){ $client = new \Kicken\RLGL\JSONStream($client); $this->clientList->attach($client, []); $client->on('data', function($data) use ($client){ // The server doesn't know the client's GUID until the client sends this data to the server if($guid=$this->getConnectionID($client)) { $this->app->process($data, $guid, $client); } elseif($guid=$this->app->getGUID($data)) { $this->addConnection($client, $guid); } }); $client->on('close', function($conn) use ($client) { if($this->socketClients->contains($client)) { $this->socketClients->detach($client); } }); $client->on('error', function($conn) use ($client) { $client->close(); }); echo "New connection accepted.\r\n"; }); $foo->on('connection', function ($guid, $data){ /* I haven't really figured out this part. Another file such as index.php will receive $guid and $data via POST or GET. It then somehow needs to get it to this service so it could be sent to the approriate client. Options are: 1) redis queue 2) HTTP server located here and index.php sends it via cURL 3) Use the existing Sockets server here and index.php needs to somehow need to send it 4) ??? */ $client=$this->findConnectionByGuid($guid); $client->write($data); }); $socket->listen($this->url_sockets['port'],$this->url_sockets['host']); $loop->addPeriodicTimer(60, function() { //Initiate communication to local SOAP servers and save data $this->app->comm->soapClient(); }); $loop->run(); } private function addConnection($client, $guid) { $this->clientList[$client]['guid']=$guid; } private function getConnectionID($client) { return $this->clientList[$client]['guid']; } private function findConnectionByGuid($guid) { //There should be a better way to do this??? $this->socketClients->rewind(); while($this->socketClients->valid()) { if($guid == $this->socketClients->getInfo()) { return $this->socketClients->current(); } $this->socketClients->next(); } return false; } }
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn
đáĐăng ngày 6 tháng 1 năm 2017 đá
Đăng ngày 6 tháng 1 năm 2017 Bạn vẫn có thể tạo bản đồ hướng dẫn nếu muốn sau khi bạn biết GUID là gì private function addConnection($client, $guid) { $this->clientList[$client]['guid']=$guid; $this->guidMap[$guid] = $client; } private function findConnectionByGuid($guid) { return isset($this->guidMap[$guid])?$this->guidMap[$guid]:null; } Nếu không có nhiều khách hàng, có lẽ tôi chỉ cần sử dụng vòng lặp, nhưng sử dụng foreach để làm cho nó đơn giản hơn Tại sao nên sử dụng SplObjectStorage?Lớp SplObjectStorage cung cấp bản đồ từ các đối tượng đến dữ liệu hoặc, bằng cách bỏ qua dữ liệu, một bộ đối tượng . Mục đích kép này có thể hữu ích trong nhiều trường hợp liên quan đến nhu cầu xác định duy nhất các đối tượng.
Ngăn xếp mảng PHP có bị tràn không?PHP sử dụng mảng số, mảng kết hợp và mảng đa chiều. Mảng có bản chất động và không nên đề cập đến kích thước. Đi qua php. net/manual/vi/ngôn ngữ. các loại. mảng. php để tìm chi tiết. Không, chỉ có MỘT loại mảng trong PHP, hoạt động khác nhau tùy thuộc vào cách nó được sử dụng
Làm cách nào để tạo lưu trữ đối tượng trong PHP?Sử dụng Nội bộ Thư viện PHP
. sử dụng \HPCloud\Bootstrap; . xác thực(); . newFromIdentity($identity); ObjectStorage. newFromIdentity là một nhà máy để tạo các đối tượng ObjectStorage từ các danh tính. |