21,891
社区成员
发帖
与我相关
我的任务
分享
class MyClass
{
funciton a(){
echo 'a';
}
}
class MyClassExted extends MyClass
{
function b(){
echo 'b';
}
}
$test = new MyClassExted();
$test->b();
$test = new MyClass();
$test->b();
class MyClass
{
funciton a(){
echo 'a';
}
}
class MyClass extends MyClass
{
function b(){
echo 'b';
}
}
$test = new MyClass();
$test->b();
<?php
class api_base
{
function a(){
echo 'a111';
}
function __call($name, $param) {
static $methods = array();
if(!method_exists($this, $name)){
list($api, $fun) = explode('_',$name);
empty($fun) && $fun = 'index';
if(!isset($methods[$api])){
include_once('class.api.'.$api.'.php');
$method = 'api_'.$api;
$methods[$api] = new $api();
}
if(!method_exists($methods[$api], $fun)){
die('error');
}
call_user_func_array(array($methods[$api], $fun), $param);
}
}
}
$test = new api_base();
$test->b(1,2,3);
$test->b(4,5,6);
$test->b_test(1,2,3);
$test->b_haha(4,5,6);
?>
class.api.b.php:
<?php
class api_b extends api_base
{
function index($a,$b,$c){
echo "$a - $b - $c <br>";
}
function test($a,$b,$c){
echo "$a - $b - $c <br>";
}
function haha($a,$b,$c){
echo "$a - $b - $c <br>";
}
}
?>
<?php
class api_base
{
function a(){
echo 'a111';
}
function __call($name, $param) {
static $methods = array();
if(!method_exists($this, $name)){
if(!isset($methods[$name])){
include_once('class.api.'.$name.'.php');
$method = 'api_'.$name;
$methods[$name] = new $method();
}
call_user_func_array(array($methods[$name], $name), $param);
}
}
}
$test = new api_base();
$test->b();
?>
class.api.b.php:
<?php
class api_b extends api_base
{
function b(){
echo 'bbbbbbbbb';
}
}
?>
class MyClass
{
function a(){
echo 'a';
}
function __call($name, $param){
if($name=='b'){
echo 'b';
}
}
}
$obj = new MyClass();
$obj->b();
class api
{
function base_a(){
}
function base_b(){
}
function user(){
}
function news(){
}
function shop(){
}
function game(){
}
function bbs(){
}
}
这个类在很多文件中引用过,使用方法类似于此
include('class.api.php');
$api = new api;
$api->shop();
新需求是这个 类中 需要再新增几个方法。
原本没有预料到这个类中会用到这么多的方法,所以全部写在一起了。
那么,对于 使用 $api->shop() 方法的程序,去引用一个包含了所有方法的类,好像是有点浪费了。
并且后期,这个 class.api.php 可能还需要就行扩展,那么 class.api.php 的文件体积会越来越大,显示不合理。
所以现在拆分这个类。
将 class.api.php 中的 基础方法保存为 class.api.base.php
class api_base
{
function base_a(){}
function base_b(){}
}
而其他的每个方法单独保存为一个文件。
比如 $api->shop() 方法,新增一个 class.api.shop.php
include('class.api.base.php');
class api_shop extends api_base
{
function shop(){
}
}
那么对于原来使用 $api->shop() 的地方,引用 class.api.shop.php 即可。
include('class.api.shop.php');
$api = new api_shop;
$api->shop();
问题就在于这里了,系统很多地方使用的是
include('class.api.php');
$api = new api;
$api->shop();
为了兼容系统中已经使用过这个类的代码,原本想,如果可以直接对类进行扩展,那么一切就很简单了。
现在看来似乎不太现实(如果真的有办法实现,请赐教)。
那么有什么方案可以保留 原 class.api.php
并且将 class.api.shop.php、class.api.news.php、class.api.game.php。。。。。等扩展类的中的方法集中这个文件中。
这样做纯属为了兼容系统旧文件的写法。
还有:不能直接保留 class.api.php,因为 shop()、game()、user()等方法还要进行维护,如果直接保留class.api.php,后期维护的时候,每次都要处理两次,太麻烦。
class MyClass
{
funciton a(){
echo 'a';
}
function __call($name, $param) {
if(function_exists($name)) {
return call_user_func_array($name, $param);
}
}
}
function b() {
echo $b;
}
$test = new MyClass();
$test->b();
trait class a
{
public function b()
{
echo 1;
}
}
class c
{
use a;
}
$test = new c;
$c->b(); // 1
class MyClass
{
function a(){
echo 'a';
}
function b(){
echo 'MyClass b';
}
}
class MyClassExtend extends MyClass
{
function b(){
echo 'MyClassExtend b';
}
}
$MyClass = new MyClass();
$MyClass->b();//MyClass b
$MyClassExtend = new MyClassExtend();
$MyClassExtend->b();//MyClassExtend b