文档章节

iOS程序猿如何快速掌握 PHP,化身"全栈攻城狮"?

ios122
 ios122
发布于 2015/10/09 22:22
字数 3019
阅读 5104
收藏 70

这是一篇以 iOS 开发人员的视角写给广大iOS 程序猿的 PHP 入门指南.在这篇文章里我努力去发掘 objectiv-c 与 php 之间的共性,来帮助有一定 iOS 开发经验的攻城狮来快速上手一门后台开发语言.后台开发语言,就是以"数据接口"的形式出现在我们的开发文档的那个东西!掌握PHP,无论对自己目前的iOS开发工作还是以后个人职场生涯的长久发展,都会大有裨益!最重要的是,PHP本身不是一个玩具语言,而是目前相当一部分公司仍然在用的后台开发语言,甚至包括你目前的公司;这篇文章,也不是一个简单的基础手册,而是以一种更适合 iOS 开发人员理解的方式来系统讲解 PHP 中最核心最重要最常用的概念和功能.阅读并有效实践本文,将有助于你拥有独立编写后台数据接口的能力.

必要的准备与说明

下载最新版XAMPP

首先,你需要下载最新版 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无法如中一样高亮显示,可能就需要点击文件右下角,以手动指定当前问文件的语法高亮方式. HelloWorld

3.在浏览器地址栏输入: http://localhost/find_php/index.php,即可看到用PHP写的Hello World.

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

因为你还<strong>没有定义视图控制器<stong>!

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.

© 著作权归作者所有

ios122
粉丝 72
博文 76
码字总数 132179
作品 3
东城
程序员
私信 提问
加载中

评论(42)

护士的小黄瓜
护士的小黄瓜

引用来自“刘旭雷”的评论

引用来自“开源中国射线科科长”的评论

引用来自“刘旭雷”的评论

引用来自“ericsoul”的评论

另外,会一个iOS,php就是全栈啦。js,css,HTML,sql不需要?这些至少是标配吧,你只管移动端么。何况还有,操作系统管理,网络管理,性能瓶颈处理,等等一切除了代码以外的,产品发布,运营过程中,必要的这些技能的基础部分。

引用来自“ios122”的评论

iOS有独立的视图控件,不需要学习js,css,html;iOS需要SQLite的基础知识. 关于全栈有许多定义,个人觉得至少熟练掌握前端(包括移动端)和后端(如php,java)开发各一门语言,就可以算得上全栈,就比单纯只会前端或后端的人,有了许多优势和发展潜力!
个人认为全栈的定义不应该是掌握前端和后端,这个也不能叫全栈,应该叫同时可以做前端和后端的工程师。全栈是建立在语言上的,应该是一种语言可以同时开发前端和后端,并且开发者具备较好的语言功底以及数据库、操作系统的基础知识。从目前的发展来看,javascript是全栈的未来,可以同时开发web、客户端、服务端。

移动互联网时代,用户为王,web不是必须的。全栈的难度在于一种语言的跨平台移植,逻辑不依赖于OS,说白了,打通前后端。一个优秀的iOSer C功底可以轻松驾驭数据库而不依赖于苹果,Linux才是未来,JS还算不上未来
linux肯定是未来。不是说JS就是未来了,高级语言5年一定会有替代出现。swift也在去做服务端的市场。只是目前来看,php、python完全没有前端趋势。c在做应用开发时成本较高。所以一个通用化的全站语言肯定是趋势,现在js只是一个探路者,相信未来还会有更优秀的语言出现。如果工程师掌握一种语言即可完成全部开发并且有不错的性能,一定会成为未来工程师的一种趋势。

真有全栈的吗?我觉得所谓的全栈不过是一桶不满,半瓶子晃荡
刘旭雷
刘旭雷

引用来自“开源中国射线科科长”的评论

引用来自“刘旭雷”的评论

引用来自“ericsoul”的评论

另外,会一个iOS,php就是全栈啦。js,css,HTML,sql不需要?这些至少是标配吧,你只管移动端么。何况还有,操作系统管理,网络管理,性能瓶颈处理,等等一切除了代码以外的,产品发布,运营过程中,必要的这些技能的基础部分。

引用来自“ios122”的评论

iOS有独立的视图控件,不需要学习js,css,html;iOS需要SQLite的基础知识. 关于全栈有许多定义,个人觉得至少熟练掌握前端(包括移动端)和后端(如php,java)开发各一门语言,就可以算得上全栈,就比单纯只会前端或后端的人,有了许多优势和发展潜力!
个人认为全栈的定义不应该是掌握前端和后端,这个也不能叫全栈,应该叫同时可以做前端和后端的工程师。全栈是建立在语言上的,应该是一种语言可以同时开发前端和后端,并且开发者具备较好的语言功底以及数据库、操作系统的基础知识。从目前的发展来看,javascript是全栈的未来,可以同时开发web、客户端、服务端。

移动互联网时代,用户为王,web不是必须的。全栈的难度在于一种语言的跨平台移植,逻辑不依赖于OS,说白了,打通前后端。一个优秀的iOSer C功底可以轻松驾驭数据库而不依赖于苹果,Linux才是未来,JS还算不上未来
linux肯定是未来。不是说JS就是未来了,高级语言5年一定会有替代出现。swift也在去做服务端的市场。只是目前来看,php、python完全没有前端趋势。c在做应用开发时成本较高。所以一个通用化的全站语言肯定是趋势,现在js只是一个探路者,相信未来还会有更优秀的语言出现。如果工程师掌握一种语言即可完成全部开发并且有不错的性能,一定会成为未来工程师的一种趋势。
开源中国射线科科长
开源中国射线科科长

引用来自“刘旭雷”的评论

引用来自“ericsoul”的评论

另外,会一个iOS,php就是全栈啦。js,css,HTML,sql不需要?这些至少是标配吧,你只管移动端么。何况还有,操作系统管理,网络管理,性能瓶颈处理,等等一切除了代码以外的,产品发布,运营过程中,必要的这些技能的基础部分。

引用来自“ios122”的评论

iOS有独立的视图控件,不需要学习js,css,html;iOS需要SQLite的基础知识. 关于全栈有许多定义,个人觉得至少熟练掌握前端(包括移动端)和后端(如php,java)开发各一门语言,就可以算得上全栈,就比单纯只会前端或后端的人,有了许多优势和发展潜力!
个人认为全栈的定义不应该是掌握前端和后端,这个也不能叫全栈,应该叫同时可以做前端和后端的工程师。全栈是建立在语言上的,应该是一种语言可以同时开发前端和后端,并且开发者具备较好的语言功底以及数据库、操作系统的基础知识。从目前的发展来看,javascript是全栈的未来,可以同时开发web、客户端、服务端。

移动互联网时代,用户为王,web不是必须的。全栈的难度在于一种语言的跨平台移植,逻辑不依赖于OS,说白了,打通前后端。一个优秀的iOSer C功底可以轻松驾驭数据库而不依赖于苹果,Linux才是未来,JS还算不上未来
开源中国射线科科长
开源中国射线科科长

引用来自“百世经纶之傲笑红尘”的评论

还算你有良心,全栈工程师是在打的引号里,iOS工程师出了iOS领域基本就是残废,不像Android工程师不仅熟悉Android,还掌握Linux,会开发Javaweb

你懂个鸡巴,我随便写个C快排,算素数,秒你Java起码6倍。
小魂淡
小魂淡
全线的定义是什么?移动端有iOS.Android.wpweb端更多,是指单纯的会开发移动端和web端?一个iOS可以引出很多,一种后端语言更是,只是会移动端和部分后端不能称为全栈吧
s
supercso

引用来自“百世经纶之傲笑红尘”的评论

还算你有良心,全栈工程师是在打的引号里,iOS工程师出了iOS领域基本就是残废,不像Android工程师不仅熟悉Android,还掌握Linux,会开发Javaweb
放屁
成都阿布
成都阿布
至少也得web全套+ios+android+DB+运维..
要不然都不好意思叫全栈
uller
uller
楼主单纯的很可爱
纯洁徐
纯洁徐

引用来自“ericsoul”的评论

以一种语言的方式来学习另一种语言,是一种错误的方式。不知道了解Java的接口或者设计模式的依赖倒置 原则否。应该是通过学习一门语言了解 计算机,了解编程这个抽象。从而达到一法通万法通的目的。这也是为什么都说c语言是学习变成最基本的语言,因为它更简单,没有太多的封装,什么基础的东西都需要自己实现,需要编程者以计算机的思考(工作原理)方式来编写程序。ps.不知道是不是手机端的问题,排版实在是无法看。

引用来自“歪歪爱Coding”的评论

嗯,会中文,然后用在中文环境下得到的经验去学习英语是错误的!是这样吗?有一定道理,但是比较狭隘。我们学习新东西往往都会在现有的经验上寻找相似的,找到不同的。java的接口是什么?和oc里的protocol是不是一样?有什么区别?就像你说的,一法通万法。web开发也有很多在影响纯客户端开发,这个其实就是思想上的交流,没有什么不可以的,只是在不同的环境下,哪个适合你。作者这个就是他对于开发的理解用php来写罢了,会有错误和弯路,这也是学习的一部分。

引用来自“ios122”的评论

就是这个意思
赞 小歪
ios122
ios122 博主

引用来自“superduper”的评论

啊!好吧!标题党!
这其实一篇写给iOS开发人员又没有PHP经验的人的文章,如果你有iOS基础,实践完本文又不能得到我说的自定义接口的能力,欢迎吐槽!
高薪诚聘 攻城狮 程序猿!(推荐人才现金奖励)

高大上滴智能家居IT公司招人啦!招人啦!!招人啦!!! 本公司集生产、研发、销售于一体、主营安防监控类产品,目标欧美市场,现正处于快速增长阶段,高薪酬、高激励,无论你是攻城狮、或程...

tt勇者无惧
2018/06/23
0
0
CSDC(长沙)开发者大会

CSDC是一场由工程师共同创造的技术大会,我们都是程序猿,工程狮,我们所追求的是大家聚集到一起,互相学习,交流,讨论,提高.演讲嘉宾和演讲内容都会经过评审筛选,保证大家得到的是非常有意义和...

CSDC开发者大会
2016/04/20
2
0
CSDC(长沙)开发者大会

CSDC是一场由工程师共同创造的技术大会,我们都是程序猿,工程狮,我们所追求的是大家聚集到一起,互相学习,交流,讨论,提高.演讲嘉宾和演讲内容都会经过评审筛选,保证大家得到的是非常有意义和...

CSDC开发者大会
2016/04/20
257
1
入职就拿iPad,一格邀你出战!

靠谱的企业雇主,前景明朗的互联网项目,完整的技术团队配置,高额的薪酬福利空间,大量高薪名企岗位在这儿等你! 参与我们的活动,入职就拿iPad。一格作为您的职业经理人,为您提供更多高薪...

程序源
2015/04/08
5
0
唐巧专访:用 HTML5 写移动应用终究不会成为主流

小编语 本文为 DevLink 专访系列,本期采访嘉宾是 iDev 苹果开发者大会特约出品人、小猿搜题产品技术负责人——唐巧。在参加 iDev 苹果开发者大会前夕,这位资深 iOS 开发者接受了 DevLink ...

DevLink
2016/10/13
323
0

没有更多内容

加载失败,请刷新页面

加载更多

python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
17分钟前
2
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
747
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
26
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
79
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部