2017-07-21 23 views
2

最近,我一直在試圖反對東方我的PHP。OOP PHP與數據如何存儲混淆

我明白麪向對象,但由於某種原因,我遇到了麻煩,當涉及到與PHP實現它。

我感覺好像沒有道理。例如,可以說我有一個Friend類。它有許多方法,如:

1)的getName

2)getAge

3)的sendMessage

等。

當用戶加載網頁時,我將填充一個數據庫中的朋友對象數組。這將是所有的用戶朋友。

到目前爲止,這是有道理的。但是,讓我們說我做了一個Ajax請求來獲取朋友的信息。數據不再可用,對嗎?

這是我困惑的地方。我不能創建應用程序,認爲我總是可以訪問這些對象。那麼,這通常如何工作?

將朋友作爲對象存儲是不是有意義,而只是具有諸如getFriend()或getFriendAge()這樣的函數,該函數將獲取friendID並從數據庫中提取數據?

我習慣於始終存在的對象,而在PHP中它們只存在於網頁的初始加載。我的網站使用大量的Ajax。

我很難把它寫成文字,希望我的困惑會被清除。謝謝!

+3

我假設你來自對象始終存在的JavaScript世界。對於任何基於HTTP的Web應用程序,這些對象都不會被保留。每個請求都會重新創建它們(各種語言和堆棧優化此步驟) - 無論是通過會話還是傳遞某種類型的標識符,然後將數據拉出 - 您需要重新創建的對象。有一些框架和編碼實踐爲你做了大部分工作,所以在你看來,它總是存在。你之後的事情叫做會話。 – Mjh

+1

@Mjh您的評論必須寫爲答案 – Neodan

+0

我不認爲您對PHP感到困惑,而是採用分佈式計算和客戶端 - 服務器模型的更高層次概念。 –

回答

1

你有2種選擇:

  1. 有你的 「朋友」 的車型實施JsonSerializable和預加載JS變量的所有數據。這有一個好處,一切都預先加載一次,然後它就停留在客戶端,只要它是neede。但是這可能會佔用很多內存的數據:

    <?php 
    $friends = $db->query("SELECT * FROM people JOIN friends WHERE friends.source_id='some user whos logged in'"); 
    ?> 
    <script> 
        window.friends = <?= json_encode($friends); ?>; 
        //friends can be used in your scripts within this page 
    
  2. 創建api。用戶只獲得他們需要的動態,但總有對每個請求作出慢這有點回程車延遲預加載數據:

    <script> 
        window.currentUserId= <?= some user whos logged in ?>; 
        $.ajax({ 
         url: "/friends.php", 
         data: { 
          source: currentUserId, 
          target: friendId 
         } 
        }); 
    </script> 
    

    某處在文件friends.php

    <?php 
    $sourceId = filter_input(INPUT_GET,"source"); 
    $target = filter_input(INPUT_GET,"target"); //Variable names are hard 
    
    //Verify that current user can see the friends of $sourceId here 
    
    $friendQ = $db->prepare("SELECT * FROM people JOIN friends WHERE friends.source_id=?" and friends.target_id=?); 
    $friendQ->bindParam(1, $sourceId); //Assume this is PDO, it really doesn't matter 
    $friendQ->bindParam(2, $target); 
    if ($friendQ->execute()) { 
        //Get results and build your model object 
        echo json_encode($friend); 
        die(); 
    } else { 
        http_status_code(500); 
        die(); 
    } 
    

從這個角度來看,您應該加載每個場景所需的最小數據量。如何爲用戶提供頁面和數據,這取決於用戶是誰,對他們和你更重要的是什麼,最終取決於你和你的應用需求。

+0

所以,我想我的困惑是爲什麼人們使用面向對象的PHP。 – Wyatt

+0

如果您只需要一個數據庫訪問API,那麼OOP可能不是必需的,至少不是PHP端。人們在PHP中使用OOP是因爲他們通常希望PHP對數據做更多的事情,而OOP允許他們編寫更簡單的代碼,這些代碼更容易維護。 – apokryfos