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?

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);

 

  • Trích dẫn

Liên kết để bình luận
Chia sẻ trên các trang web khác

Nhiều tùy chọn chia sẻ hơn

PHP SplObjectStorage so với mảng

Khái niệmCommotion

Đăng ngày 6 tháng 1 năm 2017

Khái niệmCommotion

  • PHP SplObjectStorage so với mảng

  • Các thành viên
    • 2. 4k
    • 14

  • Tác giả

    • Chia sẻ

Đă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

  • Trích dẫn

Liên kết để bình luận
Chia sẻ trên các trang web khác

Nhiều tùy chọn chia sẻ hơn

PHP SplObjectStorage so với mảng
PHP SplObjectStorage so với mảng

requinix

Đăng ngày 6 tháng 1 năm 2017

requinix

  • PHP SplObjectStorage so với mảng
    PHP SplObjectStorage so với mảng

  • quản trị viên
  • PHP SplObjectStorage so với mảng
    • 14. 4k
    • 297
  • Địa điểm. Mỹ/Los_Angeles

    • Chia sẻ

Đă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?

  • Trích dẫn

Liên kết để bình luận
Chia sẻ trên các trang web khác

Nhiều tùy chọn chia sẻ hơn

PHP SplObjectStorage so với mảng

Khái niệmCommotion

Đăng ngày 6 tháng 1 năm 2017

Khái niệmCommotion

  • PHP SplObjectStorage so với mảng

  • Các thành viên
    • 2. 4k
    • 14

  • Tác giả

    • Chia sẻ

Đă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?

 

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?

 

  • Trích dẫn

Liên kết để bình luận
Chia sẻ trên các trang web khác

Nhiều tùy chọn chia sẻ hơn

PHP SplObjectStorage so với mảng
PHP SplObjectStorage so với mảng

requinix

Đăng ngày 6 tháng 1 năm 2017

requinix

  • PHP SplObjectStorage so với mảng
    PHP SplObjectStorage so với mảng

  • quản trị viên
  • PHP SplObjectStorage so với mảng
    • 14. 4k
    • 297
  • Địa điểm. Mỹ/Los_Angeles

    • Chia sẻ

Đă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)

  • Trích dẫn

Liên kết để bình luận
Chia sẻ trên các trang web khác

Nhiều tùy chọn chia sẻ hơn

PHP SplObjectStorage so với mảng

Khái niệmCommotion

Đăng ngày 6 tháng 1 năm 2017

Khái niệmCommotion

  • PHP SplObjectStorage so với mảng

  • Các thành viên
    • 2. 4k
    • 14

  • Tác giả

    • Chia sẻ

Đă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

Và sau đó lặp lại  SplObjectStorage để tìm một đối tượng cụ thể có thuộc tính duy nhất?

 

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 đó?

Cái bắt tay nào?

 

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)

Điều này có yêu cầu chuyển khóa trên mỗi lần trao đổi không?

  • Trích dẫn

Liên kết để bình luận
Chia sẻ trên các trang web khác

Nhiều tùy chọn chia sẻ hơn

PHP SplObjectStorage so với mảng
PHP SplObjectStorage so với mảng

đá

Đăng ngày 6 tháng 1 năm 2017

đá

  • PHP SplObjectStorage so với mảng
    PHP SplObjectStorage so với mảng

  • guru
  • PHP SplObjectStorage so với mảng
    • 4. 3k
    • 92
  • Địa điểm. Bonita, Florida
  • Lứa tuổi. 36

    • Chia sẻ

Đă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ế

  • Trích dẫn

Liên kết để bình luận
Chia sẻ trên các trang web khác

Nhiều tùy chọn chia sẻ hơn

PHP SplObjectStorage so với mảng

Khái niệmCommotion

Đăng ngày 6 tháng 1 năm 2017

Khái niệmCommotion

  • PHP SplObjectStorage so với mảng

  • Các thành viên
    • 2. 4k
    • 14

  • Tác giả

    • Chia sẻ

Đă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

 

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

 

 

Đố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ế

 

 

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

  1. Đối với mỗi lần nhận dữ liệu tiếp theo, khách hàng không cần gửi lại GUID của mình
  2. Quan trọng hơn, một tập lệnh khác chỉ biết GUID của một máy khách cụ thể cần có khả năng gửi dữ liệu đến máy khách đó. Tôi đang cố gắng xác định cách tốt nhất để làm điều này, tuy nhiên, nó nằm ngoài phạm vi của bài đăng này

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;
    }
}

  • Trích dẫn

Liên kết để bình luận
Chia sẻ trên các trang web khác

Nhiều tùy chọn chia sẻ hơn

  • Dung dịch

PHP SplObjectStorage so với mảng
PHP SplObjectStorage so với mảng

đá

Đăng ngày 6 tháng 1 năm 2017

đá

  • PHP SplObjectStorage so với mảng
    PHP SplObjectStorage so với mảng

  • guru
  • PHP SplObjectStorage so với mảng
    • 4. 3k
    • 92
  • Địa điểm. Bonita, Florida
  • Lứa tuổi. 36

  • Dung dịch

    • Chia sẻ

Đă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.