我试图激发我的技能并远离程序式编码,但是切换并不容易,我对OOP概念非常陌生,所以请在阅读/回答时牢记这一点。
我在名为Jobs{}
该方法的任务非常简单,可以查询表中所有不同作业类别的数据库并将其返回。
以下是我班级内代码的摘录
function dispCategories(){
$sql = "SELECT DISTINCT category FROM jobs";
$stmnt = $db->prepare($sql);
$stmnt->execute();
return $stmnt->fetchAll();
}
现在在我的视图或html页面中,我执行以下操作
$obj = new Jobs();
$categories = $obj->dispCategories()
?>
<!--DISPLAY CATEGORIES -->
<form id="getJobByCategory" method="post" action="">
<select name="selectedCategory">
<?php
foreach ($categories as $category){
?>
<option value="<?php echo $category['category'] ?>">
<?php echo $category['category'] ?>
</option>
<?php
}
?>
我的问题
当您查看我启动对象Jobs{}
的代码并调用方法类别$categories = $obj->dispCategories()
我使用foreach
循环结合一些html&amp; PHP。这是在OOP领域做事的可接受的方式吗?
getCategories()
,我循环遍历dispCategories()
方法返回的结果? dispCategories()
方法中dispCategories()
方法返回的数据... 希望这是有道理的。只是在这里寻找一些最佳实践和指导,但请记住我是一个新手。
答案 0 :(得分:2)
我是否应该创建一个像getCategories()这样的单独方法来循环调用dispCategories()方法返回的结果?
你现在肯定在正确的轨道上。由于您的dispCategories()
方法只返回一列,因此它会返回一维数组,这是一个简单的值列表,而不是保留生成它的SQL查询特征的2D结构。我可能会修改该方法以获取所有行,然后将它们减少为单个数组,然后返回。这使得不必创建另一个方法来循环dispCategories()
返回的类别。
假设PHP 5.5+,您可以使用array_column()
轻松完成此操作:
function dispCategories(){
$sql = "SELECT DISTINCT category FROM jobs";
$stmnt = $db->prepare($sql);
$stmnt->execute();
// Return a simple 1D array of the category only
return array_column('category', $stmnt->fetchAll());
}
然后一个简单的foreach
列出它们而无需访问数组键。
foreach ($categories as $category){
?>
<option value="<?php echo $category; ?>">
<?php echo $category; ?>
</option>
<?php
}
请注意,如果htmlspecialchars()
值可能包含需要HTML实体编码的字符,则可能需要调用$category
。
或者我应该只处理实际的dispCategories()方法中的dispCategories()方法返回的数据......
不,我认为你不应该这样做。在学习OOP时,请阅读关注点分离和MVC(模型 - 视图 - 控制器)模式的概念。如果您要在创建此HTML块的Jobs
类中创建一个方法,那么它将执行更适合您的视图代码的工作。 Jobs
类应该负责从数据库中检索项目,提供有关它们的信息,并准备将它们传递给视图或模板,但视图或模板HTML应该负责组织列表从Jobs
类到适当的标记,但是你碰巧正在显示它。