原文 : http://kbs.kimbs.cn/blog/list/post/26/title/zend-framework-coding-standards-for-php-inline-documentation
Zend Framework 中的 Php 编码标准 (四) - 内嵌文档
1. Docblocks start always with "/*" or "/**". The use of "#" is not allowed. The "//" is only allowed for comments within functions.
For example :
/**
* Class docblock
*/
class
foo
{
/* Variable docblock */
public
$foo
;
/**
* Function docblock
*/
public function
__construct
()
{
// Commentted hy '//' only allowed within function
$this
->
foo
=
'foo'
;
# Commentted by '#' is not allowed within function
$this
->
foo
=
'bar'
;
}
}
复制代码
2. A docblock must contain a short description and minimum one parameter. Optionally a long description and multiple parameters can be added.
For example :
/**
* One short description and one parameter at least
*
* @param
*/
/**
* Long description and multiple parameters below
*
* One empty line to seperate the
* SHORT_DESCRIPTION,
* LONG_DESCRIPTION,
* PARAMETERS
*
* @param
* @todo
*/
复制代码
3. All docblock parts which are not keywords have to be under each other with the same indenting.
For example :
/**
* Right
*
* @component All descriptive parts
* @uses have the same indenting
*/
/**
* Wrong
*
* @component All descriptive parts
* @uses don't have the same indenting
*/
复制代码
4. Also when describing parameters the keywords, parameters, and description have to have the same indenting to be under each other.
For example :
/**
* Right, all descriptions are indented
*
* @param string $value Description of this value
* @param integer $othervalue Another description
*/
/**
* Wrong, not indenting
*
* @param string $value Description of this value
* @param integer $othervalue Another description
*/
复制代码
5. Each file which is delivered with the Zend Framework must have the following header block :
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* [url]http://framework.zend.com/license/new-bsd[/url]
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [[email protected]][email protected][/email] so we can send you a copy immediately.
*
* @category Zend
* @package __PACKAGENAME__
* @subpackage __SUBPACKAGENAME__
* @copyright Copyright (c) 2005-__ENDDATE__ Zend Technologies USA Inc. ([url]http://www.zend.com[/url])
* @license [url]http://framework.zend.com/license/new-bsd[/url] New BSD License
* @version $Id: $
* @depreciated Since 0.0.1
*/
复制代码
This format can be used in any project, for example :
/**
* Project name
*
* LICENSE
*
* License information
* in multiple lines (maybe)
*
* @category Category name
* @package Package of this file
* @subpackage Subpackage which include this file
* @copyright Copyright information
* @license License info for short
* @version $ Id and version description $
* @depreciated Since xxx
*/
复制代码
6. When other filestypes are used like *.SH, *.BAT, *.JS and so on, the header block must also be contained as header comment. Only when a filetype does not support comments like *.CSS the header block can be omited.
For example :
// zf.bat
REM Zend Framework
REM
REM LICENSE
REM
REM This source file is subject to the new BSD license that is bundled
REM with this package in the file LICENSE.txt.
REM It is also available through the world-wide-web at this URL:
REM
http://framework.zend.com/license/new-bsd
REM If you did not receive a copy of the license and are unable to
REM obtain it through the world-wide-web, please send an email
REM to
[email protected]
so we can send you a copy immediately.
REM
REM Zend
REM Copyright (c) 2005-2009 Zend Technologies USA Inc. ( http://www.zend.com )
REM
http://framework.zend.com/license/new-bsd New BSD License
// zf.sh
#############################################################################
# Zend Framework
#
# LICENSE
#
# This source file is subject to the new BSD license that is bundled
# with this package in the file LICENSE.txt.
# It is also available through the world-wide-web at this URL:
#
http://framework.zend.com/license/new-bsd
# If you did not receive a copy of the license and are unable to
# obtain it through the world-wide-web, please send an email
# to
[email protected]
so we can send you a copy immediately.
#
# Zend
# Copyright (c) 2005-2009 Zend Technologies USA Inc. ( http://www.zend.com )
#
http://framework.zend.com/license/new-bsd New BSD License
#############################################################################
// *.js
The same with php files.
7. The @package clause has to be the component which this file is part of it, there must exist exact one @package clause per header.
For example :
/**
* ...
*
* @package Zend_Controller
* @subpackage ...
* @copyright ...
* @license ...
*/
abstract class
Zend_Controller_Router_Route_Abstract
implements
Zend_Controller_Router_Route_Interface
{
// ...
}
复制代码
Another example :
/**
* ...
*
* @package Zend_Db
* @subpackage ...
* @copyright ...
* @license ...
*/
class
Zend_Db_Adapter_Mysqli
extends
Zend_Db_Adapter_Abstract
{
// ...
}
复制代码
8. The @subpackage clause has to be a logical separation within this component. Logical separations occur when there are several directories which seperate parts of the same component. Only files which are in the main directory of the framework which is "Zend" can omit the subpackage. There must exist maximum one @subpackage clause per header.
First example :
/**
* @category ...
* @package ...
* @subpackage Adapter
* @copyright ...
* @license ...
*/
class
Zend_Db_Adapter_Mysqli
extends
Zend_Db_Adapter_Abstract
{
// ...
}
复制代码
Second example :
/**
* @category ...
* @package ...
* @subpackage Table
* @copyright ...
* @license ...
*/
class
Zend_Db_Table_Select
extends
Zend_Db_Select
{
// ...
}
复制代码
Third example for no subpackage :
/**
* @category Zend
* @package Zend_Auth
* @copyright ...
* @license ...
*/
class
Zend_Auth
{
// ...
}
复制代码
9. The @copyright clause has to include the actual year of the release of the framework.
For example :
/**
* @category ...
* @package ...
* @copyright Copyright (c) 2005-2008 Zend ...
* @license ...
*/
class
Zend_Acl
{
// ...
}
复制代码
10. If this file contains a depreciated class it must have the optional @depreciated clause.
For example :
/**
* ...
*
* @depreciated Since 1.1.1
*/
class depreciateMe
{
}
复制代码
11. All classes/files which are required must contain a @see clause.
For example :
/**
* @see Zend_Controller_Dispatcher_Interface
*/
require_once
'Zend/Controller/Dispatcher/Interface.php'
;
复制代码
12. A class or interface in Zend Framework must have a class header which clauses must be added in the below seen order :
/**
* Description of the class
*
* More descriptive text which
* is allowed to span multiple lines
*
* @category Zend
* @package __PACKAGE__
* @subpackage __SUBPACKAGE__
* @uses __USES__
* @see __SEE__
* @since __SINCE__
* @copyright Copyright (c) 2005-__ENDDATE__ Zend Technologies USA Inc. ([url]http://www.zend.com[/url])
* @license [url]http://framework.zend.com/license/new-bsd[/url] New BSD License
* @depreciated Since 0.0.1
*/
class
Zend_Controller_Dispatcher
extends
Zend_Controller_Dispatcher_Class
implements
Zend_Controller_Dispatcher_Interface
复制代码
13. The @uses clause in header has to contain the extended or implemented classname. When multiple classes or interfaces are used, you must include a @uses clause for every class or interface. When no class is extended or interface is implemented then the @uses clause must be ommitted.
For example :
/**
* ...
*
* @uses ArrayAccess
* @uses Iterator
* @uses Countable
* @package ...
* @copyright ...
* @license ...
*/
class
Zend_Dojo_Data
implements
ArrayAccess
,
Iterator
,
Countable
{
// ...
}
复制代码
14. The @see clause in header is optional and can be added to link to another component within the framework. You can add multiple clauses.
For example :
/**
* ...
*
* @see Zend_Parent
* @see Zend_Interface
* @package ...
* @copyright ...
* @license ...
*/
class
Zend_Class
extends
Zend_Parent
implements
Zend_Interface
{
// ...
}
复制代码
15. The @since clause can be added optionally to include the version since which this class is available. It must include the complete version number of the framework. Only one since clause is allowed to be added.
For example :
/**
* ...
*
* @category ...
* @package ...
* @copyright ...
* @license ...
* @since Class available since Release 0.6.0
*
* @todo ...
*/
class
Zend_Console_Getopt
{
// ...
}
复制代码
16. Each function must have a function header.
For example :
class
Zend_Foo
{
/**
* Full text description of this function.
* It described all possible things
* but should not extend the line length of 100 characters.
*
* @param boolean $value Value for checking
* @since Version 1.2.3
* @see Zend_Anything
* @throws Zend_Exception When value is false
* @return array
*/
public function
bar
(
$value
)
{
require_once(
'Zend/Anything.php'
);
if (
$value
) {
return array(
'foo'
=>
$value
);
} else {
throw new
Zend_Exception
(
'Throw me !'
);
}
}
}
复制代码
17. All parameters of the function must be available. The types allowed are listed here :
(a) boolean
(b) integer
(c) string
(d) float
(e) array
(f) false
(g) true
(h) null
(i) Zend_Xxx (must be an existing class of the framework)
18. If more than one type could be used then the possible types have to be seperated with "|" like show above.
For example :
/**
* @param array|null $config configurations
*/
复制代码
19. If a parameter can be omitted the description must prepend a (optional) to the description.
For example :
/**
* @param array|null $config (optional) My optional value
*/
复制代码
20. If the function can throw an exception the @throws clause must be declared. Multiple exception types must be seperated with “|”. Also a description must be added why the exception is thrown.
For example :
class
Zend_XmlRpc_Server
extends
Zend_Server_Abstract
{
/**
* Handle an xmlrpc call (actual work)
*
* @param Zend_XmlRpc_Request $request
* @return Zend_XmlRpc_Response
* @throws Zend_XmlRpcServer_Exception|Exception
* Zend_XmlRpcServer_Exceptions are thrown for internal errors; otherwise,
* any other exception may be thrown by the callback
*/
protected function
_handle
(
Zend_XmlRpc_Request $request
)
{
// ...
}
}
复制代码
21. A @return clause must always be defined. Only for class constructor and destructor the @return clause must be ommitted. If multiple types can be returned the types must be seperated with "|". An description can be appended, but is not necessary.
For example :
class
Zend_Form
implements
Iterator
,
Countable
,
Zend_Validate_Interface
{
/**
* Overloading: access to elements, form groups, and display groups
*
* @param string $name
* @return Zend_Form_Element|Zend_Form|null
*/
public function
__get
(
$name
)
{
// ...
}
}
复制代码
22. If the class itself is returned (fluid interface) then the description ”Provides a fluent interface“ must be added.
For example :
class
Zend_Auth
{
/**
* Sets the persistent storage handler
*
* @param Zend_Auth_Storage_Interface $storage
* @return Zend_Auth Provides a fluent interface
*/
public function
setStorage
(
Zend_Auth_Storage_Interface $storage
)
{
$this
->
_storage
=
$storage
;
return
$this
;
}
}
复制代码
23. If the function does not return any value then the return value must be set to "void".
For example :
class
Zend_Application
{
/**
* Run the application
*
* @return void
*/
public function
run
()
{
$this
->
getBootstrap
()->
run
();
}
}
复制代码
24. Keep in mind that the "void" and "null" are not the same. Null means that a empty variable is returned. But void means that nothing is returned. This is a small but important difference. Therefor when return is even not called, void has to be declared in the function docblock.
For example :
class
Zend_Class
{
/**
* @return void
*/
public function
returnTheVoid
()
{
// Return nothing
}
/**
* @return null
*/
public function
returnTheNull
()
{
return
null
;
}
}
复制代码
.