竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


272月/170

PHP命名空间namespace/类别名 use/框架自动载入 机理

发布在 邵珠庆

摘要: PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的

相比 PHP5.2 版本 PHP5.3 新增了三大主要新特性

命名空间 

延迟静态绑定 

lambda匿名函数

命名空间的出现也使PHP可以更加合理的组织项目结构,同时通过命名空间和自动载入机制一大批 PHP 的 MVC 框架也随之出现,明了的项目结构的同时也按需载入,进一步减轻内存压力,加快执行效率。

因为命名空间是对目录结构友好的

namespace Home\Controller; 
class IndexController { }

而 PHP5.2 之前是按造类的下划线去做类似 命名空间 的定义的

class Home_Controller_IndexController  { }

一、 命名空间 及 USE 的本质

php 的 use 关键字并不是立刻导入所use的类,它只是声明某类的完整类名(命名空间::类标示符),而后你在上下文中使用此类时系统才会根据 use 声明获取此类的完整类名 然后利用自动加载机制进行载入

 
namespace Home\Controller; 
use Home\Model\User; 
use Home\Model\Order as OrderList; 
class IndexController {     
public function index() {         
//只有当你调用此类时,系统才会根据 use 声明获取此类的完整类名 然后利用自动加载机制进行载入         
$user = new User();         
$order = new OrderList();     
} 
}
就像如下的代码 自动载入函数是在 use 两个类之后方才实现的 因为 use 并不会立即使用此类 只有在你调用此类时系统才会在找不到此类的情况下通过 autoload 函数动态延迟加载,若仍加载不到,则报错
 

1、某命名空间下的类 的完整名称为 namespace\className,当在某命名空间上下文中访问其它命名空间下的类时,我们可以使用 use 做别名化,或者使用此类的完整名称,但要以 '\' 根命名空间开头,否则解释器会认为你是在当前命名空间上下文中调用,即 foo\bar 方式会以 currentNamespace\foo\bar的方式去加载

命名空间与linux文件系统很相似,'\' 代表根,不以根开始的皆认为以当前命名空间为基点

2、use 只是给你使用的类定义短别名,use foo\bar 后则new bar() 即new  \foo\bar(),还有个小技巧,当我们同时引用不同命名空间下的类名相同的类时可以使用 as 为其定义一个新别名

use foo\bar\sameName as classA; 
use bar\foo\sameName as classB; 
new classA(); // new \foo\bar\sameName; 
new classB(); // new \bar\foo\sameName;

3、当我们通过 入口文件 加载参数配置 实例化一个应用主体 加载路由组件解析请求 分派控制器调用方法时,期间会调用其他的类,比如 

use yii\web\Controller;

系统便会去通过自动载入函数做最一次载入尝试,若仍加载不到此类则报错

下面我们看下 Yii2 从入口文件开始一个应用实体后注册自动载入函数的流程

index.php

入口文件载入配置和系统框架时会使用require调用,因为现在还没有注册自动加载函数

载入 Yii bootstrap 文件时便通过 spl_autoload_register 注册了自动载入函数 

Yii.php

Yii2的自动载入函数

继承至 BaseYii 它要做的就是根据你命名空间类型的类名去映射为此类所在的文件路径

比如 yii\web\Controller类会根据 yii 而映射到  YII2_PATH . '/web/Controller.php' 文件中,而这个文件则是命名空间为 yii\web 的 Controller 类,将此文件载入即可访问 yii\web\Controller 类

而我们自己编写的控制器或者模型则访问时为 'app\controllers\IndexController' 'app\models\EntryForm'

则 autoload 函数会根据 app 为 映射关键字将其定位到 controllers 或 models 文件夹下从而读取对应的文件即可载入相应的类,这也是为什么 类名 与 文件名 相互对应的原因所在,若不存在对应,则你只能通过固定的 require 某个文件去加载你写在其中的类了 

扩展自己的类库

我们可以通过Yii2的自动载入机制灵活的归类我们自己写的工具类等,比如我想创建一个自己的组件库

你可以定义一个  yii\tools 命名空间的类文件 MyTools.php,比如

 

放入 vendor\yiisoft\yii2\tools 文件夹下,

通过

<?php

namespace app\controllers;

// yii一级命名空间 则 映射到 YII_PATH 下
// 根据 tools\MyTools 定位到 YII_PATH 下的 tools文件夹下的 MyTools.php
use yii\tools\MyTools;
use yii\web\Controller;

class MyController extends Controller {
}
?>

当然你也可以在你的项目目录下新建一个 tools 文件夹 把 MyTools.php 放进去,将里面的命名空间改为 app\tools 即可,系统会根据 app 映射到项目根目录 通过 tools\MyTools 把 tools文件夹下的 MyTools.php文件载入 即载入了 MyTools 类

三、剖析TP的自动载入

thinkphp的自动加载规则也一样,只不过 tp autoload函数并没有像 Yii2 basic 版预先定义一个项目根目录的映射规则,  Yii2则是以 app 顶级命名空间为默认的应用命名空间,yii顶级命名空间作为框架命名空间,所以你只要把自己的类归属到项目根目录(app下)或 YII_PATH(框架路径) 下,然后放对文件路径即可,

tp的话有的你自己想tp可以在 APP_PATH 下放多个  module ,像其预先定义的 Home ,或者你可以 BIND_MODULE来帮定义一个自己的模块,这样在通过入口文件载入的应用实体做路由时便能判断你请求的是哪个模块下的控制器和方法

tp有几个系统占用的顶级命名空间

Think Org Behavior Com Vendor

而你自己的则会以 APP_PATH 为根目录进行加载,比如 Home\Controller\IndexController.class.php,当你访问 Index 时路由解析出来的类为 Home\Controller\IndexController,自动载入函数则根据 Home 非系统命名空间而定位到你的APP_PATH下进行加载,所以TP也可以自己定义的  AUTOLOAD_NAMESAPCE做自定义扩展

'AUTOLOAD_NAMESAPCE' => [     'Tools' => APP_PATH . 'Vendor\Tools' ]

这样便把 Tools 顶级命名空间注册到了自动载入函数中,当我们

use Tools\Extension\MyTools 时

传入 autoload 的 $class 即为 Tools\Extension\MyTools,得到的 $name 其实为一级命名空间名 这里为 Tools,Tools 不符合第一条件,在 else 中读取自定义的  AUTOLOAD_NAMESAPCE,发现我们有设置 键名为 Tools 的成员

便使用 dirname(键值)得到 APP_PATH . 'Vendor',我是觉得这里 dirname 写的有些鸡肋....所以便成功的映射定位出 Tools一级命名空间所在的文件目录为 APP_PATH . 'Vendor' 下,在与完整的类名 Tools\Extension\MyTools 拼接上 EXT即可定位到类文件,加载即可。

152月/170

25个最重要的 SaaS 度量指标

发布在 邵珠庆

 

 

我在本文中将深入探讨我们选择添加到Kilometer的若干度量指标和图表,并介绍了它们的重要性。

想弄清楚哪些度量指标很重要、如何衡量它们,这并非易事。

最近我们历时6个月研究了哪些度量指标最重要,这些度量指标对SaaS公司弄清楚业务开展情况绝对必不可少。

我们之所以开展这项研究,是因为我们在构建Kilometer.io,“即世界上最简单的分析工具”。

Kilometer可以为SaaS公司自动衡量、估算和显示最重要的度量指标和图标。

我在本文中将深入探讨我们选择添加到Kilometer的若干度量指标和图表,并介绍了它们的重要性。

我将把这些度量指标分为三组:

  • 用户获取――多少用户在注册?他们又来自哪里?
    • 用户图表(用户总数/活跃用户/付费用户)
    • 新用户与取消用户
    • 本日注册/本周注册/本月注册
    • 转介访问用户/转介注册用户
    • 漏斗:网站访问->注册->付费
    • 用户世界图
  • 用户保留――用户不断回来吗?他们留存多久?
    • 增长率和流失率
    • 活跃用户
    • 不重复登录(登录间隔日期)
    • 客户生命周期
    • 用户忠诚度
  • 财务业绩――每月收入在增长吗?每个客户平均收入是多少?
    • 月收入图表
    • 生命周期价值/每个用户的收入
    • 转介收入
    • 不同数额的付款
    • 平均付款
    • 付费/未付费用户

用户获取、用户保留和财务业绩也是我们添加到Kilometer的三种仪表板的名称。

 

用户获取仪表板

该仪表板包含9个图表和度量指标,不妨逐一加以分析:

 

用户图表(用户总数/活跃用户/付费用户)

该图表非常重要,因为它让你一眼就能大致看清贵公司的状况,其中包括:有多少用户已注册?其中多少用户仍是活跃用户?又有多少人是付费用户?

需要注意的方面:

  • 该图表显示了用户的实际数量,实际上数字本身倒不是很重要。重要的是变化率,这是显示在图上的一个趋势。呈增长趋势?增长多快?增长够快吗?
  • 用户总数图表应该有最高的增长曲线(因为它既包括活跃用户,又包括已取消用户)。
  • 除非我们看到活跃用户也增长,否则用户总数增长毫无用处。如果活跃用户图表没有呈增长趋势,这意味着你在用户保留方面有问题(会在后面探讨用户保留这个度量指标)。
  • 虽然付费用户图表自然应该属于财务业绩仪表板,但是付费用户数量对SaaS公司来说通常是最重要的度量指标,因此我们决定把它也添加到用户图表,用户图表是最显眼的仪表板。
  • 如果付费用户图表的增长不如活跃用户图表来得快,这意味着下列情形当中的一种:要么新的活跃用户没有转化为付费用户,要么原来的活跃用户不再付费。

 

新用户与取消用户

注册与取消之间不断呈现交替之势。吸引新用户注册就跟防止现有用户取消来得一样重要(而防止现有用户取消的成本通常低得多)。

需要注意的方面:

  • 很显然,绿色条应该高于黑色条,但是你应该找到该图表中的异常或峰值,弄清楚为何出现了异常或峰值:
  • 在你对大多数用户计费的那一天,更多的用户取消吗?
  • 你在周末是否提供客户支持?如果没有提供,这对用户取消又有怎样的影响?

 

本日注册/本周注册/本月注册

该度量指标显示了在本日/本周/本月注册的用户数量。它还根据当前增长率,预测了多少用户会订到本日/本周/本月结束。

这个度量指标的用途主要在于心理层面,而不是分析层面,因为它鼓励你超过上一段期间获得的数量,在此基础上更上一层楼,这也是上一段期间的价值所在。

该度量指标会促使你思考:我今天做了什么来吸引更多的用户?我应该发布推特消息、宣传别的产品吗?还是应开展一项新的社交媒体营销活动?

  

转介访问用户/转介注册用户

这两个度量指标都很重要,但同时运用两者,可以为你带来全新的洞察力。

需要注意的方面:

流量/访客来源始终是最容易分析的方面,有许多免费工具可以用来完成这项任务。人们往往单单分析流量/访客来源,根据那些分析结果来做决定。比如说,Facebook给我们带来了许多流量/访客,那我们不妨把钱投到Facebook广告上。

而这大错特错,应该结合该流量/访客的具体行为来分析流量/访客。比如说,来自Facebook的访客转化为注册用户的比例可能比来自谷歌的访客高得多或低得多。

以Kilometer为例,我们得到的许多访客来自推特,来自Quora的访客几乎只有其五分之一。然而,由于我在Quora上只回答最密切相关的分析问题,所以来自Quora的访客转化为等待我们测试版的列表订户的可能性比来自推特的访客要高出600%。

毕竟,为了为贵公司做出合理决定,知道活跃用户/付费用户来自哪里,而不仅仅是网站的访客来自哪里,这一点很重要。

 

网站访客转化为注册用户/注册用户转化为付费用户

为何跟踪转化率如此重要?因为你只有衡量它们,才能提高它们。

提高转化率可以通过对设计进行A/B测试、易用性、用户导入(onboarding)过程及其他众多方法来实现。机会无穷无尽,哪怕小小的提高也会给贵公司带来显著影响。比如说,如果你优化登录页面,将转化率从2%提高到3%,这一招就能将收入提升33%!

需要注意的方面:

网站访客转化为注册用户这个度量指标很适合分析登录页面的效果。注册用户转化为付费用户受到许多因素的影响,比如用户导入过程、为客户提供实际价值的能力、建立信任关系以及其他许多因素。

那些度量指标不仅可用于测试改进效果,还可用于预防灾难。比如说,如果你的注册用户->付费客户转化率突然大大下降,这表明支付处理过程可能出了问题。这就是为什么密切关注非同寻常的变化确实很重要(将来,Kilometer可以自动发现此类变化,提醒我们的用户)。

 

 

漏斗:网站访问->注册->付费

漏斗包括与我们之前探讨的转化同样的步骤,但这仍是一个很重要的度量指标,本身值得认真分析。由于无法将转化当成独立的度量指标来对待,你需要着眼于大局,而漏斗恰恰可以派上这个用场。

不妨看一个表明这一点的例子:

第一种选择:冗长的登录页面,附有产品的详细信息(包括价格)。

第二种选择:简短的登录页面,附有产品屏幕截图和一个硕大的“免费试用”按键(根本没显示价格)。

第二种选择将访客转化为注册用户的效果可能好得多,因为你明白,想了解产品,唯一的办法就是注册。然而,由于用户注册时不知道是否实际需要该产品,注册用户变成付费用户的转化率可能极低。

这种情况下,我们就必须考虑从网站访问到付费用户的总体转化率(即完成率这个度量指标)。

在这种漏斗中,唯一重要的是漏斗的最后一步;如果牺牲前面的转化有助于提高总体转化率,你可以这么做。

 

用户世界图

虽然看起来用户世界图就是一个可有可无的度量指标,但它不仅仅是漂亮图形。

需要注意的方面:

在关注更短的时间段时,该度量指标特别有用。比如说,我们就用它来显示在过去24小时注册的用户的世界图。

就在本周,我们两次从该度量指标受益匪浅,当时一篇人气超旺的土耳其博客提到了Kilometer,突然我们开始看到大量等待测试版的列表订户来自土耳其。

次日,我们遇到了相似的情形,这回是中国。我们发现,Kilometer出现在了中国的Product Hunt网站上,我们甚至获得了44张赞成票。

这就是为什么世界图适用于查看实时本地趋势。关注实际用户而非网站访客很重要,因为这样一来,你就能排除垃圾邮件发送者、黑客和无用访客形成的“噪音”,这些网站访客不会转化为有效用户。

 

用户保留仪表板

现在,比较容易获得一批最初用户,让你的用户保留仪表板看起来大有前景。你可以使用社交网络、BetaList和Product Hunt等网站、付费广告及更多渠道,以便吸引用户试用你的解决方案。

随着更多的用户注册,你会开始产生那种甜蜜的感觉:以为自己走上了康庄大道。遗憾的是,有个因素是你无法避免的,那就是“用户保留”。

如果你的用户没有“留住”,我是指他们最初注册后没有回来使用你的产品,你的产品就“漏气”了。除非堵住漏气点,否则吸引再多用户也没有意义。要不然,就算你吸引的所有用户都注册,可是最终不再使用你的服务。

下面是你在衡量用户保留时应关注的8个图表和度量指标:

 

增长率和流失率

贵公司增长有多快,这是每个投资者都会问的头一个问题。

谈论增长时,人们往往只考虑新用户注册,有时却忘了用户流失。

何谓增长率?增长率就是一段时间内加入的新用户数量相对已有用户总数量的比率。如果你在这周初有100个用户,5个新用户在这周加入,那么这周增长率为5%。

何谓流失率?流失率完全相反,是指已取消的用户数量相对用户总数量的比率。如果你在这周初有100个用户,5个用户在这周取消,那么这周流失率为5%。

如果你结合这两个度量指标,就能估计客户群的未来增长情况。

值得一提的是,刚开始时保持高增长率要简单得多。如果你有100个用户,只需要5个新用户,就能获得5%的增长率。

如果你有100000个用户,那就需要5000个新用户,才能获得5%的增长率。

想长期保持高增长率,唯一的办法就是,在产品中加入病毒循环机制(viral-loop),这意味着让你的现有用户吸引更多的新用户。如果你的病毒循环机制靠谱,拥有的用户越多,他们带来的用户就会越多。

另一个重要提醒:流失率这个度量指标与增长率度量指标一样重要,这意味着防止老用户取消的重要性完全不亚于吸引新用户。防止用户取消通常比获取新用户来得容易、省钱。

 

活跃用户

咱们还是面对现实吧,即便你提供免费方案,用户中也有相当多一部分甚至不记得你是谁,可能根本不会再登录到你的仪表板。

用户并不取消免费产品或免费方案,至少其中绝大多数人不会。这意味着,“非活跃”用户只是让你的用户获取图表看起来比较好,他们并没有为贵公司带来任何价值。即使你的“非活跃”用户订购收费方案,他们在下一次收费后也很可能取消,因缺少使用而要求退钱。

这就是为什么衡量你的活跃用户率、竭力提高活跃用户率至关重要。

  • 每日活跃用户――是指每天登录使用你产品的用户。该度量指标很难计算,但是估计最近24个小时登录的用户比率,可以得到准确的估计数。
  • 每周活跃用户――指每周登录一次的用户。根据上一周登录的用户数量来估算。它其实依赖于你的产品;每日活跃用户比率低可以接受,但如果每周活跃用户比率也很低,你就有问题了。
  • 每月活跃用户――指每月登录一次的用户。许多公司认为一个月内不活跃的用户是已取消用户,因为他们再次变成活跃用户的可能性极低。

你能做些什么?

你不断努力增加活跃用户数,而且这么做时另辟蹊径,这点至关重要。

  • 做好用户导入过程:

用户不回来,常常是由于他们没有从产品得到自己想要的。你的用户导入过程很要紧,网上有许多实用资源和想法可以改进这方面。我们目前在努力弄清楚如何让Kilometer的用户导入过程尽量最好。

  • 使用电子邮件提醒用户你存在:

许多公司经常发送电子邮件摘要或通知消息,鼓励用户登录、查阅更多信息。

  • “不活跃”=“已取消”:

用户取消后,你怎么办?你是联系对方,询问为何离开吗?还是你采取别的做法?不管你之后怎么做,用户长时间不活跃,就应把不活跃用户当成已取消用户。

 

不重复登录(登录间隔日期)

该图表是分析用户有多活跃的另一个工具。该图表较之活跃用户这个度量指标的优势是,能够找出峰值和模式。

应该关注的方面:

  • 你在周末是否看到登录数量更多?
  • 在电子邮件促销活动和社交网络活动等之后,是否看到登录出现峰值?
  • 找到什么方法适用你,并加强这方面的力度。使用吸引用户登录的电子邮件、邮件摘要和通知,让图表“看起来更漂亮”。

 

用户保留

有几种方法可以显示用户保留,复杂表格是常用方法之一,但我们想要力求简单。想法是使用饼形图,以便显示在不同时间段有多少用户是活跃用户。

需要注意的方面:

只要用户登录进入你的系统,就被认为是活跃用户;如果忘了你,不太可能回来,那就是非活跃用户。

使用该图表就能弄清楚何时用户最常忘了你,登录大幅减少出现在哪个时间段。比如说,大多数公司会在第一个时间段后看到大幅减少。这合情合理:因为新用户想试用你的产品,于是他们注册,但如果产品并不符合预期,他们就永不回来。

所以使用该图表找到贵公司何时出现活动大幅减少,然后竭力解决这个问题。

 

 

 

客户生命周期

这个度量指标非常重要,这个度量指标关乎许多公司的存亡。

它基本上表明客户平均留存多久;如果结合该度量指标和每个客户平均收入使用(我们在介绍财务业绩仪表板时会作详细解释),就能告诉你从每个客户身上赚多少钱,或者从下一个注册用户身上赚到钱的可能性有多大。

一旦你知道了客户值多少钱,就能在用户获取渠道方面做出极其明智的决定。如果你从每个用户赚到100美元,可以在收费渠道上花多达99美元以便获得用户,同时仍能盈利。不过在估算这些数字时别忘了算上经营成本,比如服务器成本和客户支持成本等。

 

用户忠诚度

该图表直观地分析了用户的忠诚度。

它能回答许多重要问题,比如最早的活跃客户是何时加入的?

需要注意的方面:

在该图表中,寻找大幅减少也大有用处。如果你添加重要的功能特性,看看多少用户在变化前加入、可能没有意识到你所做的改进,这点非常有用。

 

财务业绩仪表板

如果你有收费方案,或者以其他某种方式对用户收费,你就要有财务业绩仪表板。

深入了解财务业绩度量指标,可以表明你从每个用户身上平均赚多少钱,因而表明你可以在获取新用户上投入多少钱。

不妨仔细检查该仪表板:

  

月收入图表

大多数实体公司的目的是创造收入。SaaS公司通常基于订购模式,大部分收入来自每月订购方案,因而让产品更稳定可靠。

如果你能保持高增长率、低流失率,月收入就会继续迅速增长。

需要注意的方面:

你的实际收入是个重要的度量指标,因为它能帮助你回答诸如此类的问题:你有足够的收入请得起另一个开发人员吗?我们租得起更大的办公室吗?

然而,更重要的是收入图上的趋势。收入在增长还是在减少?原因何在?我们对此能做点什么?

制定计划让该图表看起来更漂亮对贵公司大有助益,还能帮助你致力于做一些影响收入的工作。

 

本月收入

该度量指标不仅显示了当月获得的收入,还预测了到月底能获得多少收入。预测基于上一个月的收入。

使用预测数值,看看你赚的收入会不会超过上一个月;如果收入没有增长,这总归是不好的兆头,那样你可以制定计划来“搞定”该度量指标。

而这个度量指标的用途在于,你能看清自己在该月结束前所处的状况。

 

生命周期价值/每个用户的收入

使用用户保留仪表中显示的用户生命周期这个度量指标,乘以每个用户平均收入这个度量指标,就可以得出用户生命周期价值。结果显示了你能从每个用户身上平均赚多少钱。

需要注意的方面:

你公司在慢慢变老,用户有“选择权”拥有更长生命周期的价值。这就是为什么用户生命周期价值应该不断增加;要是它没增加,准是哪里出了问题。

你要关注有共同属性的用户群,并比较那些群体之间的生命周期价值,这很重要。

比如说:

  • 相比来自自然搜索(organic search)或付费广告的用户,来自Facebook的用户可能具有更长/更短生命周期的价值。
  • 住在美国的用户比来自欧洲的用户可能付费更多/更少。

一旦你发现了创造更多收入的用户群,有必要投入更大的精力来吸引更多的那些用户。

 

转介收入

转介收入不是你常看到的度量指标,也很难用传统工具来估算它,这就是为何大多数人不明白按最初转介将用户分成用户组的重要性。

需要注意的方面:

这是个极其有用的度量指标,你应该使用不同的时间段来分析它。坚持使用带来最多收入的渠道,这可以帮助你更有效地花费时间和资金。

 

不同数额的付款

如果你有不同的订购方案,就像几乎每家SaaS公司那样,该图表会显示其中哪些方案更受欢迎。

需要注意的方面:

虽然价格心理不在本文的探讨范围之内,但该图表可以帮助你弄清楚你的价格测试是否有效。此外,有助于看看你的订购方案是否有许多用户,可是收入很低。

如果这是样,你该如何吸引那些用户订购费用更高的方案?

  

平均付款

提高收入的一个办法是,吸引新客户,而另一个办法是,把更多产品卖给现有客户。

由于SaaS公司主要面对的是每月付款,如果它们想“把更多产品”卖给客户,就只好促使客户订购费用更高的方案。

平均付款数额提高,通常意味着更多的用户在订购费用更高的方案。

需要注意的方面:

有必要关注这个数字,但它其实不能为你表明有意思的内容。正如之前提到,趋势总是比当前数字更重要,这就是为什么我们在该度量指标中加入了与上一个时期的对比。

确保你的平均付款每月在增长,它还会影响你的月收入。

 

付费/未付费用户

如果你有免费方案,应该每天关注这些度量指标。由于免费方案的目的是最终让用户订购付费方案。

免费用户要花成本――他们从来不是真正的免费,因为他们在使用你的服务、客户支持及其他资源。在“勉强增值模式”(Freemium Model)中,将免费用户转化为付费用户应该是公司的重中之点,而“非付费用户”这个度量指标不应该忽视。

每当你看到这个度量指标,应该想到能做些什么让用户加入付费用户的行列。

以上这些就是我们在长期研究后所总结的最重要的SaaS度量指标和图表。所有这些度量指标将添加到Kilometer的仪表板中,并自动估算。