请参阅下面的编辑
我正在尝试深入研究 PHP 中的 OOP 开发,但我真的开始感到头痛或溃疡。我只是无法理解它,部分对我来说似乎太不合逻辑了,我不知道从哪里开始,这真的让我很沮丧,因为我相信努力学习它是值得的,它为我提供了更好的概述关于我的代码。
昨天我花了一整天的时间在互联网上搜索实例和解释性文章,但现在我的感觉只会让我更加困惑。我需要一些实用的技巧,而不是像这样的例子
class person {
var $name;
function set_name($new_name) {
$this->name = $new_name;
}
function get_name() {
return $this->name;
}
}
$stefan = new person();
$jimmy = new person;
$stefan->set_name("Stefan");
$jimmy->set_name("Jimmy");
echo "Stefan's full name: " . $stefan->get_name();
echo "Jimmy's full name: " . $jimmy->get_name();
像这样的例子让我质疑为什么我不应该(因为它都在同一页面中定义)只是做
$name = "Stefan";
echo "Stefan's full name: ".$name;
如果你问我,更短(更少的代码)更明显?
诺到我的项目。
我想做的是一个简单的投资组合网站。因此我只需要 4 个页面,一个主页,一个信息页面,一个关于我的工作的页面和一个联系表。我使用三个表clients
,我想在我content
的工作页面上使用它们。media
我正在考虑我的结构并想出了(在我的脑海中,不知道如何实现它)类似的东西
class Database{}
class Content extends Database{}
function showMenu(){}
function showContent{}
class Clients extends Database{}
function showClientList{}
function showClientDetails{}
class Media extends Database{}
我已经创建了一个使用公共方法建立数据库连接的数据库类query($qry)
。我从Content
课堂开始,现在看起来像这样:
class Content extends Database {
public function topMenu($page){
$db = new Database();
$db->connect();
$db->query("SELECT m_link, m_title, m_accesskey FROM menu WHERE m_type = 'top'");
$res = $db->getResult();
foreach($res AS $show){
if($page == $show['m_link']){
echo("<li id="active">$show['m_title']."</li>\n");
}else{
echo("<li>$show['m_title']."</li>\n");
}
}
}
}
顺便说一句,这有什么意义吗?
在我的 index.php 上,我有以下几行来显示菜单(工作正常)$content = new Content(); $content->topMenu($_aGET[0]);
我失去它的地方是顶部显示客户端列表或客户端详细信息的方式,这取决于变量$_aGET[0]
(包含 url)
假设我想显示客户详细信息,因此我需要来自所有三个表的记录,所以通常我会使用几个连接,就像这样
$query = "
SELECT cl.c_id, cl.c_client, cl.c_client_desc, ncc.clco_cl_id, ncc.clco_co_id, co.c_content, ncm.clme_me_id, ncm.clme_cl_id, GROUP_CONCAT(me.m_link) AS images_link
FROM clienten AS cl
LEFT JOIN norm_cl_co_rel AS ncc ON cl.c_id = ncc.clco_cl_id
LEFT JOIN content AS co ON ncc.clco_co_id = co.c_id
LEFT JOIN norm_cl_me_rel AS ncm ON cl.c_id = ncm.clme_cl_id
LEFT JOIN media AS me ON me.m_id = ncm.clme_me_id
WHERE cl.c_client = '".mysql_real_escape_string($_aGET[1])."'
AND cl.c_language_id = '"._LANGUAGE."'
AND cl.c_active = '1'
";
但就我了解 OOP 的想法而言,我应该为类中定义的每个表都有一个方法(对吗?)但是我将如何加入这些?
还是我的“故事”看起来像:“伙计,放弃它并坚持使用程序编码”?
编辑:
好的,在 Fluffeh 的帖子之后,我使用了他的示例并对其进行了一些修改以进行测试。问题是我确实得到了一些输出,但不是想要的。我的输出如下
编号:公司名称 C 描述:C 媒体: : : : : :
虽然我应该得到(值在数据库中):
编号:公司名称 公司名 描述: CompanyName 是一家公司 媒体: : 图片 1 : 图片 2 : 图 3 : 图片 4 : 图片 5
我的代码如下所示:
class media{
public $type;
public $title;
public $image;
public $desc;
}
class client{
public $name;
public $desc;
}
class clientDetails{
private $clientID;
public $clientName;
public $clientDesc;
public $clientMedia = array();
public $clientMediaFiles = 0;
public function __construct($myID){
$this->clientID = $myID;
}
public function getMyDetails(){
$db = new Database();
$db->connect();
$db->query("
SELECT c_client, c_client_desc
FROM clienten
WHERE c_client = '".mysql_real_escape_string($this->clientID)."'
");
foreach($db->getResult() as $client){
$this->name = $client['c_client'];
$this->desc = $client['c_client_desc'];
}
$db = new Database();
$db->connect();
$db->query("
SELECT ncm.clme_me_id, ncm.clme_cl_id, cl.c_id, me.m_id, me.m_type, me.m_title, me.m_desc, me.m_link
FROM norm_cl_me_rel AS ncm
LEFT JOIN clienten AS cl ON cl.c_id = ncm.clme_cl_id
LEFT JOIN media AS me ON me.m_id = ncm.clme_me_id
WHERE me.m_id IN(1,2,3,4,5)
");
foreach($db->getResult() as $media){
$this->clientMedia[$i]= new media();
$this->clientMedia[$i]->type = $media['m_type'];
$this->clientMedia[$i]->title = $media['m_title'];
$this->clientMedia[$i]->image = $media['m_image'];
$this->clientMedia[$i]->desc = $media['m_desc'];
$this->clientMediaFiles++;
}
}
public function displayMyResults(){
echo "ID: $this->clientID";
echo "<div><h3>".$this->name."</h3>";
echo "Desc: ".$this->desc."<br>";
echo "Media:<br>";
for($i=0;$i<$this->clientMediaFiles;$i++){
echo $this->clientMedia[$i]->title." : ".$this->clientMedia[$i]->desc."<br>";
}
echo "</div>";
}
}