本帖最后由 zozoylolo 于 2023-11-21 10:52 编辑
开始之前,先申明一下我个人水平有限,也并非开发商业程序的程序员,所以仅仅是吧自己学习中的一些心得进行分享,都比较基础,有不足支持还请体谅指正。对于PHP而言,一直研究原生PHP,而且因为主要是作为爱好和乐趣,更多的在研究一些文字页游之类的内容,可能对于学习PHP应用框架以及可以恰饭的商业开发并无多大涉猎,请大家谅解。言归正传,正文开始:
PHP作为目前现存比较古老的WEB编程语言,其实在初期全称是Personal Home Page,跟已经被淘汰的ASP语言一样,是通过在HTML中插入PHP标记代码来实现功能的。以登录功能为例,早期标准的PHP登录环境是这样处理的:
[PHP] 纯文本查看 复制代码 //login.html
<form action="check.php" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="登录">
</form>
//check.php
<?php
// 连接数据库(自PHP 5.5开始变为mysqli)
$conn = mysqli_connect("localhost", "user", "password", "database");
// 获取login.html通过POST提交来的name数据
$usr = $_POST['username'];
$pwd = $_POST['password'];
// 根据用户名查询数据库,获取用户信息
$sql = "SELECT * FROM [users] WHERE usr='$username'";
$result = mysqli_query($conn, $sql);
$var = mysqli_fetch_assoc($result);
// 判断是否获得数据,并且获得数据的密码与输入密码比对
if ($var && $var['password'] == $pwd) {
// 登录成功,可以进行相关操作
// ...
} else {
// 登录失败,提示错误信息
// ...
}
// 关闭数据库连接
mysqli_close($conn);
?>
在Jquery发展之后,为追求无刷新和更好的页面体验,使用了ajax提交数据,仍以登录为例,后台变化不大,主要是前端页面更换了写法:
[PHP] 纯文本查看 复制代码 //login.html
<input type="text" id="username">
<input type="password" id="password">
<button id="submit">登录</button>
<script>
$(function(){
$("#submit").click(function(){
//获取表单中信息
var $username = $("#username").val();
var $password = $("#password").val();
//发送Ajax请求到后端
$.ajax({
//后端处理文件地址
url: "login.php",
//提交方式(GET or POST,推荐POST)
method: "post",
//提交的数据内容
data: {
username: $username,
password: $password
},
success: function(result){
if(result == "success"){
//如果登录成功,后台文件echo success,这里进行登录成功的处理
}else{
//进行登录失败后的操作
}
},
error: function(){
//进行登录失败后的操作
}
});
});
});
</script>
但随着编程技术的发展和JAVA地位的不断提高,PHP也在进行自我的修正变化,甚至连名字都换成了“PHP: Hypertext Preprocessor”。这种前后端分离的编程理念一直流行至今,也衍生出了phpthink等一系列非常优秀的编程框架。甚至我自己都一度以为PHP这种前后端分离的理念,是跟Jquery紧密联系在一起的。
直到最近了解到一个2009年左右就停更的WEB文字游戏devana才发现,这种PHP前后端分离的编写方法其实早就有了概念,而这个开源代码也应用了一种完全不同的写法,用纯粹的原生PHP完成了代码的编写。仍然以登录功能为例:
1、devana前台文件login.php大同小异,就是一个表单显示的HTML内容,这里暂且略过。
2、后台处理文件login_.php就开始不同了,在完成基本的数据处理之后,从核心文件调用函数(function)login()来进行数据处理。
[PHP] 纯文本查看 复制代码 <?php include "antet.php"; include "func.php";
if (isset($_POST["name"], $_POST["pass"]))
{
$_POST["name"]=clean($_POST["name"]); $_POST["pass"]=clean($_POST["pass"]);
//注意看,这里使用login()函数进行登录信息数据的验证和处理
$_SESSION["user"]=login($_POST["name"], md5($_POST["pass"]));
$config=config();
if ((!$config[2][1])&&($_SESSION["user"][4]<4))
{
$_SESSION = array();
session_destroy();
msg($lang['loginClosed']);
}
else if ($_SESSION["user"][0])
{
if (check_d($_SESSION["user"][0]))
{
$row=update_lastVisit($_SESSION["user"][0]);
msg($lang['welcome'].", ".$_SESSION["user"][1].".</br>".$lang['youHave']." ".$row[0]." ".$lang['newRep']." ".$row[1]." ".$lang['newMsg'].".");
}
else header('Location: logout.php');
}
else msg($lang['noUserWrong']);
}
else msg($lang['noInput']);
?>
3、核心函数文件fun.php中的login()函数内容:
[PHP] 纯文本查看 复制代码 function login($name, $pass)
{
global $db_id;
$query="select * from users where name='".$name."' and pass='".$pass."' and level>0";
$result=mysqli_query($db_id, $query);
$row=mysqli_fetch_row($result);
return $row;
}
这样的处理,在没有使用Jquery的情况下,用原生PHP代码实现了前后端的分离。所有的后端处理以函数的形式写成fun.php文件,前端提交的数据在对应的后端文件直接调用函数解决。这样在对代码整体调控、编写、修改的时候,只要处理好fun.php文件就可以完成,已经可以看出明显的前后端分离出行。
看完这个源代码,让我觉得,其实在编写功能代码的同时,使用什么样的代码是一回事,但是优秀的代码往往都具备更清晰的逻辑。
附录:德瓦纳(Devana)
Devana是一款开源浏览器策略游戏,使用以MVC(模型视图控制器)范式编写的OOP(面向对象编程)代码开发(没有任何第三方代码)。可以在地图上任何你想要的地方创建你自己的首都,扩大你不断发展的帝国、升级建筑物;建立一个平衡的经济,稍后将支持你和你的盟友;锻造可以用来训练部队的武器,或者将其出售以换取资源或其他物品;创建或加入现有联盟;宣战,缔造和平,所有这些都是为了你制定一个统治世界/和平的政治计划;训练强大的军队来保卫你的边界或征服和扩张你的帝国。
不用担心版权问题,devana是一个开源代码,作者是(Busuioc Andrei)许可证书如下:
Copyright (C) 2008-2009 Andrei Busuioc
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
(允许任何人出于任何目的使用本软件,包括商业应用程序,并对其进行更改和重新分发自由,受以下限制:)
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required.
(不得歪曲本软件的来源,如果您使用此软件在产品中,需要在产品文档中进行确认。)
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
(更改后的源版本必须清楚地标记为该版本,并且不得被误传为原始软件。)
3. This notice may not be removed or altered from any source distribution.
(本通知不得从任何来源分发中删除或更改。)
Andrei Busuioc adevland@yahoo.com
官方网站:http://devana.eu/
官方下载地址:https://sourceforge.net/projects/devana/ |