MAC PHP MARK
这是一篇以 iOS 开发人员的视角写给广大iOS 程序猿的 PHP 入门指南.在这篇文章里我努力去发掘 objectiv-c 与 php 之间的共性,来帮助有一定 iOS 开发经验的攻城狮来快速上手一门后台开发语言.后台开发语言,就是以"数据接口"的形式出现在我们的开发文档的那个东西!掌握PHP,无论对自己目前的iOS开发工作还是以后个人职场生涯的长久发展,都会大有裨益!最重要的是,PHP本身不是一个玩具语言,而是目前相当一部分公司仍然在用的后台开发语言,甚至包括你目前的公司;这篇文章,也不是一个简单的基础手册,而是以一种更适合 iOS 开发人员理解的方式来系统讲解 PHP 中最核心最重要最常用的概念和功能.阅读并有效实践本文,将有助于你拥有独立编写后台数据接口的能力.
必要的准备与说明
首先,你需要下载最新版 XAMPP软件,以在本地搭建一个 php 服务器.下载地址: https://www.apachefriends.org/download.html.
下载完成后,双击安装.安装成功后,选择 Mange Servers-->Start All启动本地服务器.启动成功后,在浏览器中输入 http://localhost,就可以看到一个默认的PHP页面.
你的php服务器文件默认放在: 应用程序-->XAMPP-->htdocs 目录下.
然后你还需要下载一款PHP编辑器,此时我使用Github的Atom编辑器.个人感觉界面很舒适,代码高亮看着也很舒服,你可以到这里下载:https://atom.io.下载完成后,点击安装即可.
最后要说明的是:PHP版本很多,下面的讲解支持目前最常用的 php 5.3.0 及其以上版本.
Hello World!
下面编写最简单的 Hello World 程序,请在以下步骤执行.
1.在 应用程序-->XAMPP-->htdocs 目录下新建目录 find_php.
没有特别的意思,纯碎是为了演示方便,同时不干扰默认存在的php文件.
2.打开Atom编辑器,使用 cmd+N
新建文件,并输入以下代码,并 cmd+S
保存到 find_php目录,文件命名为 index.php.
<?php
echo 'Hello World';
?>
如果PHP无法如中一样高亮显示,可能就需要点击文件右下角,以手动指定当前问文件的语法高亮方式.
3.在浏览器地址栏输入: http://localhost/find_php/index.php,即可看到用PHP写的Hello World.
AppDelegate 入口文件
iOS应用通常是以 AppDelegate 文件作为编码的起始(准确说的是 main.m,在此不细究).在PHP中,你可以使用一个 index.php 文件作为你的 php 程序的唯一入口.你的所有的php页面间的访问与跳转,都将是由此处开始.下面的代码可以先先复制到你的 index.php种,它实现了一个基本的页面访问与控制的框架:
<?php
$controller = '';
$model = array();
if (isset($_GET['viewController'])) {
$controller = $_GET['viewController'];
}
if (isset($_GET['model'])) {
$model = $_GET['model'];
}
echo '控制器:'.$controller.'<br />';
echo '数据模型:<br />';
foreach ($model as $key => $value) {
echo $key.':'.$value.'<br />';
}
?>
然后在浏览器地址栏,输入: http://localhost/find_php/index.php?viewController=HomeViewController&model[id]=42&model[name]=iOS122&model[age]=25
页面输入:
控制器:HomeViewController
数据模型:
id:42
name:iOS122
age:25
viewController=
后面跟的是你你的表示你的视图控制器, model
是一个字典,用于存储数据模型,支持输入多个键值对.id
,name
,age
等都是自定义的键,用于表示你想要传给新页面的数据,如果没有可以不写.
注意: 此处暂仅考虑简单的GET请求,至于其他变体可在熟悉PHP语法后,自行书写.学习新语言的初期,努力寻找新东西与已经掌握的东西的共通之处,总是可以事半功倍!
MVC 设计模式
我们仍然从常用的MVC模式来开始更进一步的讨论.M,即Model数据模型,对应于我们在地址栏输入的model;V,即视图View,更直接地说是显示数据,为了简化讨论,我们此处仅对移动端开发常用的JSON格式数据的显示作一实现;C,即Controller控制器,也就是我们常说的视图控制器,下面会具体讨论如何在PHP中定义视图控制器.
注意: 移动端数据接口只是PHP的应用场景之一.其实你日常接触的绝对部分网站都是由 PHP 驱动的,要想写出布局优美的网站,你需要学习HTML和JS相关的知识.如果有兴趣,建议去这个网站: http://www.w3school.com.cn
改进后的 index.php
<?php // index.php
/* 实现类文件的自动加载 */
function __autoload($className) {
if (file_exists($className . '.php')) {
require_once $className . '.php';
return true;
}
return false;
}
// --------------------------------
/* 获取用户想要访问的页面的相关信息. */
$controllerName = '';
$model = array();
if (isset($_GET['viewController'])) {
$controllerName = $_GET['viewController'];
}
if (isset($_GET['model'])) {
$model = $_GET['model'];
}
/* 跳转到指定页面. */
if ('' !== $controllerName) {
/* 我们约定每个控制器都至少有一个$model属性和 show方法 */
$controller = new $controllerName();
$controller->model = $model;
$controller->show();
}
?>
这个方法可以实现根据用户输入自动跳转至对应的界面.你直接把代码复制到index.php中即可,因为它暂时不再需要做变更了.一些说明的技术点是:
- 实现了 魔术方法 __autoload,以实现自动加载相关的类文件.这有些类似于我们在 .pch中全局引入某个头文件,然后整个工程处处可用一样.
- php 是一种弱类型语言,你定义变量时不必声明类型,但是变量要以 美元符号 $开头.
- php 使用 new 函数来创建一个对象,语法是
new 类名()
,这不禁让我想起 oc 中的 new函数,它的语法是: [类名 new]; - php 中的函数,看起来更像是C语言函数,也许说更像 oc 中的block,可能更好理解些.
- php 访问属性,使用的是
->
,而不是.
;另一种 php 访问属性的方式是使用obj['属性名']
,如$controller['model'].
此时你访问 http://localhost/find_php/index.php?viewController=HomeViewController&model[id]=42&model[name]=iOS122&model[age]=25
,应该会报错:
syntax error, unexpected '>' in /Applications/XAMPP/xamppfiles/htdocs/find_php/HomeViewController.php on line 38
因为你还没有定义视图控制器!
Controller:定义视图控制器
在find_php文件夹新建 HomeViewController.php 文件,并把下面的代码复制进去:
<?php // HomeViewController.php
/* 建议一个文件中只有一个 与文件同名的类.
如果需要继承自其他类,可以使用关键字 extends,如 */
class HomeViewController
{
/*
定义属性,允许定义时,给属性一个默认值,这一点比OC灵活.
public 关键字用于指定外部可访问;
类似的还有 private(仅允许内部访问),protected(仅允许自身及其子类访问);
属性前必须有关键字 public/private/protected 中的一个.
*/
public $model = array(); // 定义允许外部访问的属性.
/* 构造函数,相当于init初始化方法;
当调用New 函数新建对象时,此方法会被自动调用;
array 指明参数类型, $model是实参, $model = array(),用于指定默认参数;
指定了默认参数的参数,在调用时,可以不传;
public 关键字作用等同于属性的关键字,默认可以不传,不传则为public;
*/
public function __construct(array $model = array())
{
/* 在实例方法内部访问对象的属性,使用 $this 关键字,且属性名前没有美元符号$;
类似于 oc 中的self,但是使用的是 `->` 而不是 `.` */
$this->model = $model;
}
/*
析构函数,作用和 oc 中的dealloc很像.
*/
public function __destruct()
{
$this->model = NULL;
}
/* 获取内容,用于输出显示. */
protected function getContent()
{
/* 默认把用户输入以JSON格式返回 */
$content = json_encode($this->model);
return $content;
}
/*
定义实例方法:show;
定义方法使用的是关键字 function,且无法指定返回值,这点不如 oc 方便;
*/
public function show()
{
/* 使用$this关键字来调用另一个实例方法. */
$content = $this->getContent();
echo $content;
}
}
此时你访问 http://localhost/find_php/index.php?viewController=HomeViewController&model[id]=42&model[name]=iOS122&model[age]=25
,输出应该是:
{"id":"42","name":"iOS122","age":"25"}
说明,页面的确跳转到了 HomeViewController控制器,并有效输出;而且输出的是我们移动端开发最常接触的 json 格式的数据.
以上的代码,充分展示了php作为一门面向对象(OOP)语言最常用的几个功能,如定义属性,定义实例方法,在示例方法内访问属性与实例方法等.PHP作为一门弱类型的OOP语言,也有一些非常强大的特性,推荐阅读:
Model: 关于数据模型的几点说明.
- 网上关于MVC中M的讨论,此处我选取的是最基本的一种: M专指用于存储某种数据的类的实例.它可以用于数据的格式化存储和传递,但不应包含发起网络请求和读写数据库等操作;
- 在本文讨论的Model中,我们进一步简化了Model,允许且只允许用于通过URL来定义某个控制器的Model;
- PHP 是一本弱类型的语言,所以不必专门为某种控制器指定某种类型的Model.
- "PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。"
View: 一个显示HTML的实例.
返回 JSON 格式的数据,已经达到了做移动端开发的需要,但此处仍然使用HTML语法来显示数据,以便于更好地理解.用下面的代码替换 HomeViewController.php 文件的 getContent 方法:
/* 获取内容,用于输出显示. */
protected function getContent()
{
$content = '<html><body><ul>';
foreach ($this->model as $key => $value) {
$content .= "<li>$key:$value</li>";
}
$content .= '</ul></body></html>';
return $content;
}
此时你访问 http://localhost/find_php/index.php?viewController=HomeViewController&model[id]=42&model[name]=iOS122&model[age]=25
,输出应该是:
- id:42
- name:iOS122
- age:25
浏览器中会被自动解析为一个列表.对应的HTML代码如下:
<html>
<head></head>
<body>
<ul>
<li>id:42</li>
<li>name:iOS122</li>
<li>age:25</li>
</ul>
</body></html>
此处使用了简单的HTML标签.
小结
本文通过模拟实现 iOS 的MVC的设计模式,来概要性地讲解了PHP中的对应的各个概念.熟悉以上操作,可以使你具备自定义服务器接口的基本能力.参与讨论,参见:http://www.ios122.com/tag/php/ 更全面地信息,参见PHP官方中文文档:http://ua2.php.net/manual/zh/langref.php.
MAC PHP MARK的更多相关文章
- Mac 在命令行快速切换目录 mark
转自: http://www.ccvita.com/520.html ,略修改. 每天在命令行下,一大部分的工作都是一遍又一遍的输入 cd ~/some/very/deep/often-used/di ...
- [mark] 使用Sublime Text 2时如何将Tab配置为4个空格
在Mac OS X系统下,Sublime Text是一款比较赞的编辑器. 作为空格党的自觉,今天mark一下使用Sublime Text 2时如何将Tab配置为4个空格: 方法来自以下两个链接: ht ...
- 记录下Sublime Text Mac版的快捷键【转】
推荐使用最新版本的Chrome/Safari或者Firefox浏览器浏览此页,否则Mac按键可能无法正常展示 The Latest Version of Chrome/Safari or Firefo ...
- Mac & XCode 使用技巧总结
Mac OS 是基于UNIX 的操作系统. 一 基本技巧 1. 允许安装任何来源的APP 系统偏好设置 -> 安全性和隐私 -> 通用 选择”允许从以下位置下载的应用程序“ 中的 “任何来 ...
- Mac OS X 背后的故事
Mac OS X 背后的故事 作者: 王越 来源: <程序员> 发布时间: 2013-01-22 10:55 阅读: 25840 次 推荐: 49 原文链接 [收藏] ...
- Mac OS X Terminal 101:终端使用初级教程
Mac OS X Terminal 101:终端使用初级教程 发表于 2012 年 7 月 29 日 由 Renfei Song | 文章目录 1 为什么要使用命令行/如何开启命令行? 2 初识Com ...
- pox目录中的交换机mac地址学习模块 l2_multi源码
# Copyright 2012-2013 James McCauley # # Licensed under the Apache License, Version 2.0 (the "L ...
- Hadoop on Mac with IntelliJ IDEA - 8 单表关联NullPointerException
简化陆喜恒. Hadoop实战(第2版)5.4单表关联的代码时遇到空指向异常,经分析是逻辑问题,在此做个记录. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Ha ...
- Mac开发利器之程序员编辑器MacVim学习总结
Emacs和Vim都是程序员专用编辑器,Emacs被称为神的编辑器,Vim则是编辑器之神.至于两者到底哪个更好用,网络上两大派系至今还争论不休.不过,相比之下,Emacs更加复杂,已经不能算是一个编辑 ...
随机推荐
- HTML5自学笔记[ 4 ]js中新增的选择器方法
querySelector():参数与jQuery一样,这个方法获取一组元素中的第一个元素. querySelectorAll():获取一组元素. getElementsByClassName():获 ...
- sql 语句 截取字符串的两种方案
方案一:使用内置的函数 SUBSTRING,CHARINDEX,LEN三个内置函数 理论: SUBSTRING语法 SUBSTRING ( value_expression , start_exp ...
- css+div如何解决文字溢出
看到标题你一定很轻易就会想到截断文字加“...”的做法.哈哈,就是这样.其实写这篇日志也只是把这样方法做个记录,因为似乎还有很多人不记得碰到这样的情况该如何处理. 首先,先解释一下,一般用div+cs ...
- PHP函数——parse_ini_file() 函数
资料网址:http://www.w3school.com.cn/php/func_filesystem_parse_ini_file.asp 1.parse_ini_file() 函数解析一个配置文件 ...
- Go运行环境搭建(Mac\Linux)
转载:http://blog.csdn.net/nellson/article/details/51523159 1. 下载安装文件 http://www.golangtc.com/download ...
- [整理]Svn常见问题汇总。
1.’.’ is not a working copy.Can’t open file‘.svn/entries’: 系统找不到指定的路径. 解答:原因是输入的访问路径不正确,如svn://192.1 ...
- [原创]Keys的基本操作总结,判断Keys中是否存在Keys.Control|Keys.Alt,移除Keys中的部分键值。
直接看应用实例 /// <summary> /// 组合键转换成字符串类型 /// </summary> /// <param name="keyCode&qu ...
- svn resolve/merge
svn merge http://svn.a.com/branches/20150129_168954_sales-impr_1 svn resolve --accept working web/sr ...
- C# 文件与目录的基本操作(System.IO)
1. 文件操作 /// <summary> /// 文件读写操作 /// 为简化代码供大家学习,暂不考虑捕捉异常 /// </summary> public partial c ...
- JavaScript自定义右键菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...